diff --git a/lstV2/server/services/notifications/controller/notifications/bow2henkelincoming.ts b/lstV2/server/services/notifications/controller/notifications/bow2henkelincoming.ts index b965352..0c83d0e 100644 --- a/lstV2/server/services/notifications/controller/notifications/bow2henkelincoming.ts +++ b/lstV2/server/services/notifications/controller/notifications/bow2henkelincoming.ts @@ -4,95 +4,92 @@ import { notifications } from "../../../../../database/schema/notifications.js"; import { tryCatch } from "../../../../globalUtils/tryCatch.js"; import { createLog } from "../../../logger/logger.js"; import { query } from "../../../sqlServer/prodSqlServer.js"; -import { sendEmail } from "../sendMail.js"; import { bow2incoming } from "../../../sqlServer/querys/notifications/bow2henkel.js"; +import { sendEmail } from "../sendMail.js"; const notification = async (notifyData: any) => { - /** - * Pass the entire notification over - */ - createLog("debug", "reprinting", "notify", `monitoring ${notifyData.name}`); + /** + * Pass the entire notification over + */ + createLog("debug", "reprinting", "notify", `monitoring ${notifyData.name}`); - // validate if there are any emails. - if (notifyData.emails === "") { - createLog( - "error", - "reprinting", - "notify", - `There are no emails set for ${notifyData.name}` - ); - return; - } + // validate if there are any emails. + if (notifyData.emails === "") { + createLog( + "error", + "reprinting", + "notify", + `There are no emails set for ${notifyData.name}`, + ); + return; + } - //let labels: Labels[]; + //let labels: Labels[]; - const { data: l, error: labelError } = await tryCatch( - query( - bow2incoming.replace( - "[time]", - notifyData.notifiySettings.processTime - ), - "Label Reprints" - ) - ); - const labels: any = l?.data as any; - if (labelError) { - createLog( - "error", - "reprinting", - "notify", - `Failed to get the labels: ${labelError}` - ); - return; - } + const { data: l, error: labelError } = await tryCatch( + query( + bow2incoming.replace("[time]", notifyData.notifiySettings.processTime), + "Label Reprints", + ), + ); + const labels: any = l?.data as any; + if (labelError) { + createLog( + "error", + "reprinting", + "notify", + `Failed to get the labels: ${labelError}`, + ); + return; + } - if (labels.length > 0) { - //send the email :D - const emailSetup = { - email: notifyData.emails, - subject: "Alert! New incoming goods has been received", - template: "bow2IncomingGoods", - context: { - items: labels, - time: notifyData.notifiySettings.processTime, - }, - }; + if (labels.length > 0) { + //send the email :D + const emailSetup = { + email: notifyData.emails, + subject: "Alert! New incoming goods has been received", + template: "bow2IncomingGoods", + context: { + items: labels, + time: notifyData.notifiySettings.processTime, + }, + }; - const sentEmail = await sendEmail(emailSetup); + const sentEmail = await sendEmail(emailSetup); - if (!sentEmail.success) { - createLog( - "error", - "reprinting", - "notify", - "Failed to send email, will try again on next interval" - ); - return; - } + if (!sentEmail.success) { + createLog( + "error", + "reprinting", + "notify", + "Failed to send email, will try again on next interval", + ); + return; + } - // // update the last time we ran and the prod id - // const notifUpdate = { - // prodID: labels[0].IdEtikettenHistorie, - // lastRan: nowDate(), - // }; + // // update the last time we ran and the prod id + // const notifUpdate = { + // prodID: labels[0].IdEtikettenHistorie, + // lastRan: nowDate(), + // }; - // update the last time ran + // update the last time ran - const { data, error } = await tryCatch( - db - .update(notifications) - .set({ - lastRan: sql`NOW()`, - notifiySettings: { - ...notifyData.notifiySettings, - prodID: labels[0].IdEtikettenHistorie, - }, - }) - .where(eq(notifications.name, notifyData.name)) - ); - } else { - return; - } + const { data, error } = await tryCatch( + db + .update(notifications) + .set({ + lastRan: sql`NOW()`, + notifiySettings: { + ...notifyData.notifiySettings, + prodID: labels[0].IdEtikettenHistorie, + }, + }) + .where(eq(notifications.name, notifyData.name)), + ); + } else { + return; + } }; export default notification; diff --git a/lstV2/server/services/notifications/controller/notifications/cycleCountCheck.ts b/lstV2/server/services/notifications/controller/notifications/cycleCountCheck.ts new file mode 100644 index 0000000..5e97df6 --- /dev/null +++ b/lstV2/server/services/notifications/controller/notifications/cycleCountCheck.ts @@ -0,0 +1,108 @@ +import { eq, sql } from "drizzle-orm"; +import { db } from "../../../../../database/dbclient.js"; +import { notifications } from "../../../../../database/schema/notifications.js"; +import { tryCatch } from "../../../../globalUtils/tryCatch.js"; +import { createLog } from "../../../logger/logger.js"; +import { query } from "../../../sqlServer/prodSqlServer.js"; +import { + type SqlQuery, + sqlQuerySelector, +} from "../../../sqlServer/utils/querySelector.utils.js"; +import { sendEmail } from "../sendMail.js"; + +export interface Labels { + IdEtikettenHistorie?: number; +} +const notification = async (notifyData: any) => { + /** + * Pass the entire notification over + */ + createLog("debug", "reprinting", "notify", `monitoring ${notifyData.name}`); + + // validate if there are any emails. + if (notifyData.emails === "") { + createLog( + "error", + "reprinting", + "notify", + `There are no emails set for ${notifyData.name}`, + ); + return; + } + const cycleCountCheck = sqlQuerySelector("cycleCountCheck.query") as SqlQuery; + + if (!cycleCountCheck.success) { + console.log("Failed to load the query: ", cycleCountCheck.message); + return; + } + + const { data: c, error: cError } = await tryCatch( + query( + cycleCountCheck.query.replace("[timeTest]", notifyData.checkInterval), + "Cycle count check", + ), + ); + const cycle: any = c?.data ?? ([] as any); + + //console.log(cycle); + + if (cError) { + createLog( + "error", + "reprinting", + "notify", + `Failed to get the labels: ${cError}`, + ); + return; + } + + if (cycle.length > 0) { + //send the email :D + const emailSetup = { + email: notifyData.emails, + subject: `Alert! RowBlocked for more than ${notifyData.checkInterval} min(s)`, + template: "cycleCountCheck", + context: { + checkTime: notifyData.checkInterval, + items: cycle, + }, + }; + + const sentEmail = await sendEmail(emailSetup); + + if (!sentEmail.success) { + createLog( + "error", + "reprinting", + "notify", + "Failed to send email, will try again on next interval", + ); + return; + } + + // // update the last time we ran and the prod id + // const notifUpdate = { + // prodID: labels[0].IdEtikettenHistorie, + // lastRan: nowDate(), + // }; + + // update the last time ran + + const { data, error } = await tryCatch( + db + .update(notifications) + .set({ + lastRan: sql`NOW()`, + // notifiySettings: { + // ...notifyData.notifiySettings, + // prodID: labels[0].IdEtikettenHistorie, + // }, + }) + .where(eq(notifications.name, notifyData.name)), + ); + } else { + return; + } +}; + +export default notification; diff --git a/lstV2/server/services/notifications/notifyService.ts b/lstV2/server/services/notifications/notifyService.ts index 9f9c788..03a0dff 100644 --- a/lstV2/server/services/notifications/notifyService.ts +++ b/lstV2/server/services/notifications/notifyService.ts @@ -12,6 +12,7 @@ import blocking from "./routes/qualityBlocking.js"; import sendemail from "./routes/sendMail.js"; import errorHandling from "./routes/tooManyErrors.js"; import { note, notificationCreate } from "./utils/masterNotifications.js"; +import { sqlJobCleanUp } from "./utils/notificationSqlCleanup.js"; import { startNotificationMonitor } from "./utils/processNotifications.js"; const app = new OpenAPIHono(); @@ -57,6 +58,7 @@ if (notesError) { setTimeout(() => { notificationCreate(); startNotificationMonitor(); + sqlJobCleanUp(); }, 5 * 1000); export default app; diff --git a/lstV2/server/services/notifications/utils/masterNotifications.ts b/lstV2/server/services/notifications/utils/masterNotifications.ts index 6dcf28c..6e23cac 100644 --- a/lstV2/server/services/notifications/utils/masterNotifications.ts +++ b/lstV2/server/services/notifications/utils/masterNotifications.ts @@ -152,6 +152,18 @@ export const note: any = [ errorCount: 10, // change this to something else or leave blank to use the av type }, }, + { + name: "cycleCountCheck", + description: + "Checks if a cycle count has been active for longer than the defined time.", + checkInterval: 60, + timeType: "min", + emails: "", + active: false, + notifiySettings: { + errorCount: 10, // change this to something else or leave blank to use the av type + }, + }, ]; export const notificationCreate = async () => { diff --git a/lstV2/server/services/notifications/utils/views/cycleCountCheck.hbs b/lstV2/server/services/notifications/utils/views/cycleCountCheck.hbs new file mode 100644 index 0000000..e3476a6 --- /dev/null +++ b/lstV2/server/services/notifications/utils/views/cycleCountCheck.hbs @@ -0,0 +1,44 @@ + + + + + + {{!-- --}} + {{> styles}} + + +

All,

+

The below are cycle counts that have been in progress for longer than {{checkTime}} min(s).

+ + + + + + + + + + {{!-- --}} + + + + {{#each items}} + + + + + + + + {{!-- --}} + + {{/each}} + +
WarehouseIDWarehouseLocationIDLocationCycle count StartedStarted byDowntime finish
{{idWarehouse}}{{warehouse}}{{locationId}}{{location}}{{cycleCountStartAt}}{{blockedBy}}{{dtEnd}}
+
+

Thank you,

+

LST Team

+
+ + + \ No newline at end of file