diff --git a/client/src/pages/jobs-available/jobs-available.page.container.jsx b/client/src/pages/jobs-available/jobs-available.page.container.jsx index ebe58cd8d..bb17df1bf 100644 --- a/client/src/pages/jobs-available/jobs-available.page.container.jsx +++ b/client/src/pages/jobs-available/jobs-available.page.container.jsx @@ -51,6 +51,17 @@ export function JobsAvailablePageContainer({ partnerVersion, setBreadcrumbs, set {!partnerVersion && ( + + + } message={t("general.messages.partnernotrunning", { app: InstanceRenderManager({ imex: "$t(titles.imexonline)", diff --git a/client/src/redux/email/email.reducer.js b/client/src/redux/email/email.reducer.js index bd9485d97..86582d98d 100644 --- a/client/src/redux/email/email.reducer.js +++ b/client/src/redux/email/email.reducer.js @@ -8,7 +8,8 @@ const INITIAL_STATE = { name: "ShopName", address: InstanceRenderManager({ imex: "noreply@iemx.online", - rome: "noreply@romeonline.io" + rome: "noreply@romeonline.io", + promanager: "noreply@promanager.web-est.com" }) }, to: null, diff --git a/client/src/utils/CleanAxios.js b/client/src/utils/CleanAxios.js index 513e71bc8..15bcdad46 100644 --- a/client/src/utils/CleanAxios.js +++ b/client/src/utils/CleanAxios.js @@ -1,5 +1,6 @@ import axios from "axios"; import { auth } from "../firebase/firebase.utils"; +import InstanceRenderManager from "./instanceRenderMgr"; axios.defaults.baseURL = import.meta.env.VITE_APP_AXIOS_BASE_API_URL || @@ -12,6 +13,13 @@ export const axiosAuthInterceptorId = axios.interceptors.request.use( if (token) { config.headers.Authorization = `Bearer ${token}`; } + InstanceRenderManager({ + executeFunction: true, + args: [], + promanager: () => { + config.headers["Convenient-Company"] = "promanager"; + } + }); } return config; diff --git a/hasura/metadata/tables.yaml b/hasura/metadata/tables.yaml index d1ad52033..7ab9621df 100644 --- a/hasura/metadata/tables.yaml +++ b/hasura/metadata/tables.yaml @@ -920,6 +920,7 @@ - cdk_dealerid - city - claimscorpid + - convenient_company - country - created_at - default_adjustment_rate diff --git a/hasura/migrations/1713813407204_alter_table_public_bodyshops_add_column_convenient_company/down.sql b/hasura/migrations/1713813407204_alter_table_public_bodyshops_add_column_convenient_company/down.sql new file mode 100644 index 000000000..ba02ff1a2 --- /dev/null +++ b/hasura/migrations/1713813407204_alter_table_public_bodyshops_add_column_convenient_company/down.sql @@ -0,0 +1,4 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- alter table "public"."bodyshops" add column "convenient_company" text +-- null; diff --git a/hasura/migrations/1713813407204_alter_table_public_bodyshops_add_column_convenient_company/up.sql b/hasura/migrations/1713813407204_alter_table_public_bodyshops_add_column_convenient_company/up.sql new file mode 100644 index 000000000..f8c0069ba --- /dev/null +++ b/hasura/migrations/1713813407204_alter_table_public_bodyshops_add_column_convenient_company/up.sql @@ -0,0 +1,2 @@ +alter table "public"."bodyshops" add column "convenient_company" text + null; diff --git a/server/email/tasksEmails.js b/server/email/tasksEmails.js index c874f0592..8c6f7c624 100644 --- a/server/email/tasksEmails.js +++ b/server/email/tasksEmails.js @@ -24,7 +24,7 @@ const ses = new aws.SES({ const transporter = nodemailer.createTransport({ SES: { ses, aws }, - sendingRate: 40 // 40 emails per second. + sendingRate: InstanceManager({ imex: 40, rome: 10 }) }); // Initialize the Tasks Email Queue @@ -41,38 +41,28 @@ const tasksEmailQueueCleanup = async () => { } }; -// Handling SIGINT (e.g., Ctrl+C) -process.on("SIGINT", async () => { - await tasksEmailQueueCleanup(); - process.exit(0); -}); -// Handling SIGTERM (e.g., sent by system shutdown) -process.on("SIGTERM", async () => { - await tasksEmailQueueCleanup(); - process.exit(0); -}); -// Handling uncaught exceptions -process.on("uncaughtException", async (err) => { - await tasksEmailQueueCleanup(); - process.exit(1); // Exit with an 'error' code -}); -// Handling unhandled promise rejections -process.on("unhandledRejection", async (reason, promise) => { - await tasksEmailQueueCleanup(); - process.exit(1); // Exit with an 'error' code -}); - -const fromEmails = InstanceManager({ - imex: "ImEX Online ", - rome: "Rome Online ", - promanager: "ProManager " -}); - -const endPoints = InstanceManager({ - imex: process.env?.NODE_ENV === "test" ? "https://test.imex.online" : "https://imex.online", - rome: process.env?.NODE_ENV === "test" ? "https//test.romeonline.io" : "https://romeonline.io", - promanager: process.env?.NODE_ENV === "test" ? "https//test.promanager.web-est.com" : "https://promanager.web-est.com" -}); +if (process.env.NODE_ENV !== "development") { + // Handling SIGINT (e.g., Ctrl+C) + process.on("SIGINT", async () => { + await tasksEmailQueueCleanup(); + process.exit(0); + }); + // Handling SIGTERM (e.g., sent by system shutdown) + process.on("SIGTERM", async () => { + await tasksEmailQueueCleanup(); + process.exit(0); + }); + // Handling uncaught exceptions + process.on("uncaughtException", async (err) => { + await tasksEmailQueueCleanup(); + process.exit(1); // Exit with an 'error' code + }); + // Handling unhandled promise rejections + process.on("unhandledRejection", async (reason, promise) => { + await tasksEmailQueueCleanup(); + process.exit(1); // Exit with an 'error' code + }); +} /** * Format the date for the email. @@ -105,6 +95,17 @@ const formatPriority = (priority) => { * @returns {{header, body: string, subHeader: string}} */ const generateTemplateArgs = (title, priority, description, dueDate, bodyshop, job, taskId) => { + const endPoints = InstanceManager({ + imex: process.env?.NODE_ENV === "test" ? "https://test.imex.online" : "https://imex.online", + rome: + bodyshop.convenient_company === "promanager" + ? process.env?.NODE_ENV === "test" + ? "https//test.promanager.web-est.com" + : "https://promanager.web-est.com" + : process.env?.NODE_ENV === "test" + ? "https//test.romeonline.io" + : "https://romeonline.io" + }); return { header: title, subHeader: `Body Shop: ${bodyshop.shopname} | Priority: ${formatPriority(priority)} ${formatDate(dueDate)}`, @@ -121,12 +122,15 @@ const generateTemplateArgs = (title, priority, description, dueDate, bodyshop, j * @param taskIds * @param successCallback */ -const sendMail = (type, to, subject, html, taskIds, successCallback) => { - // Push next messages to Nodemailer - //transporter.once("idle", () => { - // Note: This is commented out because despite being in the documentation, it does not work - // and stackoverflow suggests it is not needed - // if (transporter.isIdle()) { +const sendMail = (type, to, subject, html, taskIds, successCallback, requestInstance) => { + const fromEmails = InstanceManager({ + imex: "ImEX Online ", + rome: + requestInstance === "promanager" + ? "ProManager " + : "Rome Online " + }); + transporter.sendMail( { from: fromEmails, @@ -184,7 +188,8 @@ const taskAssignedEmail = async (req, res) => { tasks_by_pk.job, newTask.id ) - ) + ), + tasks_by_pk.bodyshop.convenient_company ); // We return success regardless because we don't want to block the event trigger. @@ -233,6 +238,14 @@ const tasksRemindEmail = async (req, res) => { // Iterate over all recipients and send the email. recipientCounts.forEach((recipient) => { + const fromEmails = InstanceManager({ + imex: "ImEX Online ", + rome: + onlyTask.bodyshop.convenient_company === "promanager" + ? "ProManager " + : "Rome Online " + }); + const emailData = { from: fromEmails, to: recipient.email @@ -261,6 +274,18 @@ const tasksRemindEmail = async (req, res) => { } // There are multiple emails to send to this author. else { + const endPoints = InstanceManager({ + imex: process.env?.NODE_ENV === "test" ? "https://test.imex.online" : "https://imex.online", + rome: + allTasks[0].bodyshop.convenient_company === "promanager" + ? process.env?.NODE_ENV === "test" + ? "https//test.promanager.web-est.com" + : "https://promanager.web-est.com" + : process.env?.NODE_ENV === "test" + ? "https//test.romeonline.io" + : "https://romeonline.io" + }); + const allTasks = groupedTasks[recipient.email]; emailData.subject = `New Tasks Reminder - ${allTasks.length} Tasks require your attention`; emailData.html = generateEmailTemplate({ diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js index 2ae4d2618..5a200f77c 100644 --- a/server/graphql-client/queries.js +++ b/server/graphql-client/queries.js @@ -2431,6 +2431,7 @@ exports.QUERY_REMIND_TASKS = ` jobid bodyshop { shopname + convenient_company } bodyshopid } @@ -2453,6 +2454,7 @@ query QUERY_TASK_BY_ID($id: uuid!) { } bodyshop{ shopname + convenient_company } job{ ro_number