Email notification
This commit is contained in:
parent
15c250d28a
commit
5bd1460966
@ -20,7 +20,7 @@ const path = require("path");
|
|||||||
exports.testEmail = async (req, res) => {
|
exports.testEmail = async (req, res) => {
|
||||||
placeHolderData = {
|
placeHolderData = {
|
||||||
contact_name : 'Gowtham',
|
contact_name : 'Gowtham',
|
||||||
portal_url : process.env.BASE_URL,
|
portal_url : process.env.FE_BASE_URL,
|
||||||
username : '--',
|
username : '--',
|
||||||
password : '--',
|
password : '--',
|
||||||
support_email : '--',
|
support_email : '--',
|
||||||
@ -309,6 +309,12 @@ exports.getAllEstablishments = async (req, res) => {
|
|||||||
// Fetch Data
|
// Fetch Data
|
||||||
const data = await Establishment.findAll({
|
const data = await Establishment.findAll({
|
||||||
where: whereClause,
|
where: whereClause,
|
||||||
|
attributes: {
|
||||||
|
include: [
|
||||||
|
[
|
||||||
|
Sequelize.literal(`(SELECT COUNT(*) FROM establishment_products ep WHERE ep.establishment_id = establishments.id)`),"product_count" ]
|
||||||
|
]
|
||||||
|
},
|
||||||
include: [
|
include: [
|
||||||
{ model: CityTown, as: "establishment_city", attributes: ["name"] },
|
{ model: CityTown, as: "establishment_city", attributes: ["name"] },
|
||||||
{ model: Emirate, as: "establishment_emirate", attributes: ["name"] },
|
{ model: Emirate, as: "establishment_emirate", attributes: ["name"] },
|
||||||
|
|||||||
@ -11,10 +11,12 @@ const Product = db.Product;
|
|||||||
const CityTown = db.CityTown;
|
const CityTown = db.CityTown;
|
||||||
const Emirate = db.Emirate;
|
const Emirate = db.Emirate;
|
||||||
const QuarterlyWindowsConfiguration = db.QuarterlyWindowsConfiguration;
|
const QuarterlyWindowsConfiguration = db.QuarterlyWindowsConfiguration;
|
||||||
|
const User = db.user;
|
||||||
const ExcelJS = require("exceljs");
|
const ExcelJS = require("exceljs");
|
||||||
const { Op } = require("sequelize");
|
const { Op } = require("sequelize");
|
||||||
const { Sequelize } = require("sequelize");
|
const { Sequelize } = require("sequelize");
|
||||||
const { sendEmail } = require("../services/email.service");
|
const { sendEmail } = require("../services/email.service");
|
||||||
|
const { sendEmailService } = require("../services/email.service");
|
||||||
const { getQuarterPeriods } = require("../services/quarterService");
|
const { getQuarterPeriods } = require("../services/quarterService");
|
||||||
|
|
||||||
|
|
||||||
@ -105,10 +107,94 @@ exports.createSubmission = async (req, res) => {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// const result = await Submission.findByPk(submission.id, {
|
||||||
|
// include: [{ model: SubmissionProduct, as: "products" },{ model: EstablishmentUser,as: "created_user",attributes: ["name"],}],
|
||||||
|
// });
|
||||||
|
|
||||||
|
|
||||||
|
// //send email
|
||||||
|
// const EstablishmentData = await Establishment.findOne({ where: { id :result['establishment_id'] } });
|
||||||
|
// const EstablishmentUserData = await EstablishmentUser.findAll({ where: { establishment_id :result['establishment_id'] , is_active : 1} });
|
||||||
|
// const AdminUsersData = await User.findAll({ where: { is_active : 1} });
|
||||||
|
|
||||||
|
// for await (const userObj of EstablishmentUserData)
|
||||||
|
// {
|
||||||
|
// placeHolderData = {
|
||||||
|
// user_name : userObj.name,
|
||||||
|
// quarter : result['quarter'],
|
||||||
|
// year : result['year'],
|
||||||
|
// establishment_name : EstablishmentData['factory_name'],
|
||||||
|
// submitted_by : result['created_user.name'],
|
||||||
|
// submission_date : result['created_at'],
|
||||||
|
// support_email : process.env.SUPPORT_EMAIL,
|
||||||
|
// support_phone : process.env.SUPPORT_PHONE,
|
||||||
|
// portal_url : process.env.FE_BASE_URL,
|
||||||
|
// }
|
||||||
|
|
||||||
|
// await sendEmailService(userObj.email, 'submission_created_mail_to_establishment_user', placeHolderData);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// for await (const userObj of AdminUsersData)
|
||||||
|
// {
|
||||||
|
// placeHolderData = {
|
||||||
|
// user_name : userObj.name,
|
||||||
|
// quarter : result['quarter'],
|
||||||
|
// year : result['year'],
|
||||||
|
// establishment_name : EstablishmentData['factory_name'],
|
||||||
|
// submitted_by : result['created_user.name'],
|
||||||
|
// submission_date : result['created_at'],
|
||||||
|
// support_email : process.env.SUPPORT_EMAIL,
|
||||||
|
// support_phone : process.env.SUPPORT_PHONE,
|
||||||
|
// portal_url : process.env.FE_BASE_URL,
|
||||||
|
// }
|
||||||
|
|
||||||
|
// await sendEmailService(userObj.email, 'submission_created_mail_to_admin', placeHolderData);
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
const result = await Submission.findByPk(submission.id, {
|
const result = await Submission.findByPk(submission.id, {
|
||||||
include: [{ model: SubmissionProduct, as: "products" }],
|
include: [
|
||||||
|
{ model: SubmissionProduct, as: "products" },
|
||||||
|
{ model: EstablishmentUser, as: "created_user", attributes: ["name"] },
|
||||||
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Fetch required data for email
|
||||||
|
const EstablishmentData = await Establishment.findOne({ where: { id: result.establishment_id }});
|
||||||
|
const EstablishmentUserData = await EstablishmentUser.findAll({where: { establishment_id: result.establishment_id, is_active: 1 }});
|
||||||
|
const AdminUsersData = await User.findAll({where: { is_active: 1 }});
|
||||||
|
|
||||||
|
// Shared placeholder data
|
||||||
|
const basePlaceholder = {
|
||||||
|
quarter: result.quarter,
|
||||||
|
year: result.year,
|
||||||
|
establishment_name: EstablishmentData.factory_name,
|
||||||
|
submitted_by: result.created_user?.name,
|
||||||
|
submission_date: result.created_at,
|
||||||
|
support_email: process.env.SUPPORT_EMAIL,
|
||||||
|
support_phone: process.env.SUPPORT_PHONE,
|
||||||
|
portal_url: process.env.FE_BASE_URL
|
||||||
|
};
|
||||||
|
|
||||||
|
// --- SEND EMAILS TO ESTABLISHMENT USERS ---
|
||||||
|
const establishmentEmailPromises = EstablishmentUserData.map((userObj) => {
|
||||||
|
return sendEmailService(userObj.email,"submission_created_mail_to_establishment_user",{...basePlaceholder,user_name: userObj.name,});
|
||||||
|
});
|
||||||
|
|
||||||
|
// --- SEND EMAILS TO ADMINS ---
|
||||||
|
const adminEmailPromises = AdminUsersData.map((userObj) => {
|
||||||
|
return sendEmailService(userObj.email,"submission_created_mail_to_admin",{...basePlaceholder,user_name: userObj.name,} );
|
||||||
|
});
|
||||||
|
|
||||||
|
// Execute ALL emails in parallel
|
||||||
|
await Promise.all([
|
||||||
|
...establishmentEmailPromises,
|
||||||
|
...adminEmailPromises,
|
||||||
|
]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
res.status(201).json({ status: "success", data: result });
|
res.status(201).json({ status: "success", data: result });
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@ -634,6 +720,9 @@ exports.approveOrRejectSubmission = async (req, res) => {
|
|||||||
|
|
||||||
const { id } = req.params;
|
const { id } = req.params;
|
||||||
approve_reject_status = req.body.approve_reject_status;
|
approve_reject_status = req.body.approve_reject_status;
|
||||||
|
reject_reason = req.body.reject_reason;
|
||||||
|
approve_or_reject_by = req.body.approve_or_reject_by;
|
||||||
|
|
||||||
if(approve_reject_status == 1)
|
if(approve_reject_status == 1)
|
||||||
{
|
{
|
||||||
statusString = 'Approved';
|
statusString = 'Approved';
|
||||||
@ -647,7 +736,52 @@ exports.approveOrRejectSubmission = async (req, res) => {
|
|||||||
return res.status(404).json({ status: "failed", message: "Submission not found" });
|
return res.status(404).json({ status: "failed", message: "Submission not found" });
|
||||||
|
|
||||||
// Update submission main data
|
// Update submission main data
|
||||||
const result = await submission.update({ approve_reject_status : approve_reject_status , status : statusString });
|
const result = await submission.update({ approve_reject_status : approve_reject_status , status : statusString, reject_reason, approve_or_reject_by });
|
||||||
|
|
||||||
|
|
||||||
|
//send email to establishment user
|
||||||
|
const EstablishmentData = await Establishment.findOne({ where: { id :result['establishment_id'] } });
|
||||||
|
const EstablishmentUserData = await EstablishmentUser.findAll({ where: { establishment_id :result['establishment_id'] , is_active : 1} });
|
||||||
|
|
||||||
|
if(approve_reject_status == 1)
|
||||||
|
{
|
||||||
|
for await (const userObj of EstablishmentUserData)
|
||||||
|
{
|
||||||
|
placeHolderData = {
|
||||||
|
user_name : userObj.name,
|
||||||
|
portal_url : process.env.FE_BASE_URL,
|
||||||
|
quarter : result['quarter'],
|
||||||
|
year : result['year'],
|
||||||
|
establishment_name : EstablishmentData['factory_name'],
|
||||||
|
submission_date : result['created_at'],
|
||||||
|
rejection_reason : result['reject_reason'],
|
||||||
|
support_email : process.env.SUPPORT_EMAIL,
|
||||||
|
support_phone : process.env.SUPPORT_PHONE,
|
||||||
|
}
|
||||||
|
|
||||||
|
await sendEmailService(userObj.email, 'submission_approved_mail_to_establishment_user', placeHolderData);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
|
||||||
|
for await (const userObj of EstablishmentUserData)
|
||||||
|
{
|
||||||
|
placeHolderData = {
|
||||||
|
user_name : userObj.name,
|
||||||
|
portal_url : process.env.FE_BASE_URL,
|
||||||
|
quarter : result['quarter'],
|
||||||
|
year : result['year'],
|
||||||
|
establishment_name : EstablishmentData['factory_name'],
|
||||||
|
submission_date : result['created_at'],
|
||||||
|
rejection_reason : result['reject_reason'],
|
||||||
|
support_email : process.env.SUPPORT_EMAIL,
|
||||||
|
support_phone : process.env.SUPPORT_PHONE,
|
||||||
|
}
|
||||||
|
|
||||||
|
await sendEmailService(userObj.email, 'submission_rejected_mail_to_establishment_user', placeHolderData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
status: "success",
|
status: "success",
|
||||||
|
|||||||
@ -66,6 +66,16 @@ module.exports = (sequelize, DataTypes) => {
|
|||||||
tableName: "establishment_users",
|
tableName: "establishment_users",
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
EstablishmentUser.associate = (models) => {
|
||||||
|
|
||||||
|
EstablishmentUser.belongsTo(models.Establishment, {
|
||||||
|
foreignKey: 'establishment_id',
|
||||||
|
as: 'establishments',
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
return EstablishmentUser;
|
return EstablishmentUser;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -32,6 +32,12 @@ module.exports = (sequelize, DataTypes) => {
|
|||||||
approve_reject_status: {
|
approve_reject_status: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,
|
||||||
defaultValue: 0,
|
defaultValue: 0,
|
||||||
|
},
|
||||||
|
approve_or_reject_by: {
|
||||||
|
type: DataTypes.INTEGER,
|
||||||
|
},
|
||||||
|
reject_reason: {
|
||||||
|
type: DataTypes.STRING(255),
|
||||||
},
|
},
|
||||||
status: {
|
status: {
|
||||||
type: DataTypes.STRING(50),
|
type: DataTypes.STRING(50),
|
||||||
|
|||||||
@ -30,6 +30,10 @@ module.exports = (sequelize, DataTypes) => {
|
|||||||
type: DataTypes.DATE,
|
type: DataTypes.DATE,
|
||||||
allowNull: true,
|
allowNull: true,
|
||||||
},
|
},
|
||||||
|
is_active: {
|
||||||
|
type: DataTypes.BOOLEAN,
|
||||||
|
defaultValue: true,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
return User;
|
return User;
|
||||||
|
|||||||
@ -1838,6 +1838,7 @@ router.post("/unit-master/uploadCSV",[ verifySignature, verifyToken, upload.sing
|
|||||||
* 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 }
|
||||||
* products:
|
* products:
|
||||||
* type: array
|
* type: array
|
||||||
* items:
|
* items:
|
||||||
@ -1910,6 +1911,7 @@ router.post("/submissions",[verifySignature, verifyToken], submissionController.
|
|||||||
* 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 }
|
||||||
* products:
|
* products:
|
||||||
* type: array
|
* type: array
|
||||||
* items:
|
* items:
|
||||||
@ -2143,6 +2145,12 @@ router.put("/enableOrDisableSubmissionEditAccess/:id",[verifySignature, verifyTo
|
|||||||
* approve_reject_status:
|
* approve_reject_status:
|
||||||
* type: integer
|
* type: integer
|
||||||
* description: 1 for Approve, 2 for Reject
|
* description: 1 for Approve, 2 for Reject
|
||||||
|
* reject_reason:
|
||||||
|
* type: string
|
||||||
|
* description: rejection reason
|
||||||
|
* approve_or_reject_by:
|
||||||
|
* type: integer
|
||||||
|
* description: logged admin user primary id
|
||||||
* responses:
|
* responses:
|
||||||
* 200:
|
* 200:
|
||||||
* description: Updated successfully
|
* description: Updated successfully
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user