From e909e8deecb54a3e4c39789609b0aa7435b9e08a Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Tue, 9 Jun 2026 07:00:27 -0500 Subject: [PATCH] feat(eom): migrated eom endpoints from old version validated working --- README.md | 2 +- backend/eom/eom.gpdata.route.ts | 107 ++++++++++++++++++ backend/eom/eom.history.controller.ts | 9 ++ backend/eom/eom.historyInv.route.ts | 61 ++++++++++ backend/eom/eom.lastPurchasePrice.route.ts | 78 +++++++++++++ backend/eom/eom.lastSalesPrice.route.ts | 89 +++++++++++++++ .../eom/eom.productionConsumption.route.ts | 98 ++++++++++++++++ backend/eom/eom.purchased.route.ts | 98 ++++++++++++++++ backend/eom/eom.regrind.route.ts | 98 ++++++++++++++++ backend/eom/eom.routes.ts | 35 ++++++ backend/eom/eom.soldItems.route.ts | 98 ++++++++++++++++ backend/gpSql/queries/gp.eom.data.sql | 16 +++ .../prodSql/queries/eom.lastPurchasePrice.sql | 15 +++ .../prodSql/queries/eom.lastSalesPrice.sql | 14 +++ .../queries/eom.productionConsumption.sql | 7 ++ backend/prodSql/queries/eom.purchased.sql | 40 +++++++ backend/prodSql/queries/eom.regrind.sql | 13 +++ backend/prodSql/queries/eom.soldItems.sql | 15 +++ backend/routeHandler.routes.ts | 2 + backend/system/settingsBase.controller.ts | 10 ++ backend/utils/returnHelper.utils.ts | 3 +- 21 files changed, 906 insertions(+), 2 deletions(-) create mode 100644 backend/eom/eom.gpdata.route.ts create mode 100644 backend/eom/eom.history.controller.ts create mode 100644 backend/eom/eom.historyInv.route.ts create mode 100644 backend/eom/eom.lastPurchasePrice.route.ts create mode 100644 backend/eom/eom.lastSalesPrice.route.ts create mode 100644 backend/eom/eom.productionConsumption.route.ts create mode 100644 backend/eom/eom.purchased.route.ts create mode 100644 backend/eom/eom.regrind.route.ts create mode 100644 backend/eom/eom.routes.ts create mode 100644 backend/eom/eom.soldItems.route.ts create mode 100644 backend/gpSql/queries/gp.eom.data.sql create mode 100644 backend/prodSql/queries/eom.lastPurchasePrice.sql create mode 100644 backend/prodSql/queries/eom.lastSalesPrice.sql create mode 100644 backend/prodSql/queries/eom.productionConsumption.sql create mode 100644 backend/prodSql/queries/eom.purchased.sql create mode 100644 backend/prodSql/queries/eom.regrind.sql create mode 100644 backend/prodSql/queries/eom.soldItems.sql diff --git a/README.md b/README.md index 12f36f4..8660514 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Quick summary of current rewrite/migration goal. | Transport Insight | Integrations | ⏳ Not Started | | Quality Request Tool | Add Pallet, Monitor for moved, status changes, alerts | ⏳ Not Started | | Logistics | Consume material, return and print, label info, relocate | ⏳ Not Started | -| EOM | Endpoints, Report Pull for finance | ⏳ Not Started | +| EOM | ~~Endpoints~~, Report Pull for finance, SSRS report | 🟨 In Progress | | ~~OCME~~ | ~~Custom integration~~ | Canceled | | API Migration | Moving to new REST endpoints | 🔧 In Progress | | System | Tests,Builds, Updates, Remote Logging, DB Backups, Alerting | ⏳ Not Started | diff --git a/backend/eom/eom.gpdata.route.ts b/backend/eom/eom.gpdata.route.ts new file mode 100644 index 0000000..b907bf1 --- /dev/null +++ b/backend/eom/eom.gpdata.route.ts @@ -0,0 +1,107 @@ +import { formatInTimeZone } from "date-fns-tz"; +import { Router } from "express"; +import { gpQuery } from "../gpSql/gpSqlQuery.controller.js"; +import { + type SqlGPQuery, + sqlGpQuerySelector, +} from "../gpSql/gpSqlQuerySelector.utils.js"; +import { apiReturn } from "../utils/returnHelper.utils.js"; +import { tryCatch } from "../utils/trycatch.utils.js"; + +const r = Router(); + +r.get("/", async (req, res) => { + const { startDate, endDate, glCode, includePlantToken } = req.query; + + if ( + !startDate || + startDate === "" || + !endDate || + endDate === "" || + !glCode || + glCode === "" + ) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "GpData", + message: + "The start date, end date, and gl code are required to run this query.", + data: [], + status: 400, + }); + } + const sqlQuery = sqlGpQuerySelector(`gp.eom.data`) as SqlGPQuery; + + if (!sqlQuery.success) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "GpData", + message: + "Failed to get GpData sql file please, please contact support if this continues.", + data: [], + status: 400, + }); + } + + const { data, error } = await tryCatch( + gpQuery( + sqlQuery.query + .replace("[startDate]", startDate as string) + .replace("[endDate]", endDate as string) + .replace("[gpCode]", glCode as string), + "Eom GpData data", + ), + ); + + if (error) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "GpData", + message: `Error getting GpData data info`, + data: error as any, + notify: false, + status: 400, + }); + } + + return apiReturn(res, { + success: data.success, + level: data.success ? "info" : "error", + module: "eom", + subModule: "GpData", + message: data.message, + data: + includePlantToken === "true" && data.success + ? data.data.map((i) => { + return { + plantToken: process.env.PROD_PLANT_TOKEN, + ...i, + Date_Received: formatInTimeZone( + i.Date_Received, + "etc/utc", + "M/d/yyyy", + ), + }; + }) + : data.data.map((i) => { + return { + ...i, + Date_Received: formatInTimeZone( + i.Date_Received, + "etc/utc", + "M/d/yyyy", + ), + }; + }), + notify: false, + status: data.success ? 200 : 400, + }); +}); + +export default r; diff --git a/backend/eom/eom.history.controller.ts b/backend/eom/eom.history.controller.ts new file mode 100644 index 0000000..29f255e --- /dev/null +++ b/backend/eom/eom.history.controller.ts @@ -0,0 +1,9 @@ +/** + * The flow that will trigger all the history functions to run and store the data each day and clean up as needed + * + * if we are on usmcd1vms036 we will run a get request to all servers in the db so we can store that data as well. + * + * this will be stored in both. the vms036 functions will store in a bigger server so it can be pulled faster and in ssrs + */ + +export const eomHistory = async () => {}; diff --git a/backend/eom/eom.historyInv.route.ts b/backend/eom/eom.historyInv.route.ts new file mode 100644 index 0000000..ff18e8b --- /dev/null +++ b/backend/eom/eom.historyInv.route.ts @@ -0,0 +1,61 @@ +import { format } from "date-fns"; +import { eq } from "drizzle-orm"; +import { Router } from "express"; +import { db } from "../db/db.controller.js"; +import { invHistoricalData } from "../db/schema/historicalInv.schema.js"; +import { apiReturn } from "../utils/returnHelper.utils.js"; +import { tryCatch } from "../utils/trycatch.utils.js"; + +const r = Router(); + +r.get("/", async (req, res) => { + // the params we are wanting to add in. min required will be the month so we dont pass everything over + const { date } = req.query; + + if (!date || date === "") { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "historical inv", + message: + "The day of the month is required to be included in order to pass.", + data: [], + status: 400, + }); + } + + // get the date passed over. + const { data, error } = await tryCatch( + db + .select() + .from(invHistoricalData) + .where( + eq(invHistoricalData.histDate, format(date as string, "yyyy-MM-dd")), + ), + ); + + if (error) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "historical inv", + message: + "There was an error getting the historical data from the server.", + data: error as any, + status: 400, + }); + } + + return apiReturn(res, { + success: true, + level: "info", + module: "eom", + subModule: "historical inv", + message: "Eom Historical Inv Data", + data: data, + status: 200, + }); +}); +export default r; diff --git a/backend/eom/eom.lastPurchasePrice.route.ts b/backend/eom/eom.lastPurchasePrice.route.ts new file mode 100644 index 0000000..f12ecf6 --- /dev/null +++ b/backend/eom/eom.lastPurchasePrice.route.ts @@ -0,0 +1,78 @@ +import { formatInTimeZone } from "date-fns-tz"; +import { Router } from "express"; +import { prodQuery } from "../prodSql/prodSqlQuery.controller.js"; +import { + type SqlQuery, + sqlQuerySelector, +} from "../prodSql/prodSqlQuerySelector.utils.js"; +import { apiReturn } from "../utils/returnHelper.utils.js"; +import { tryCatch } from "../utils/trycatch.utils.js"; + +const r = Router(); + +r.get("/", async (req, res) => { + const { includePlantToken } = req.query; + + const sqlQuery = sqlQuerySelector(`eom.lastPurchasePrice`) as SqlQuery; + + if (!sqlQuery.success) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "lastPurchasePrice", + message: + "Failed to get last sales price sql file please, please contact support if this continues.", + data: [], + status: 400, + }); + } + + const { data, error } = await tryCatch( + prodQuery( + sqlQuery.query, + + "Eom last purchase price data", + ), + ); + + if (error) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "lastPurchasePrice", + message: `Error getting last purchase Price data info`, + data: error as any, + notify: false, + status: 400, + }); + } + + return apiReturn(res, { + success: data.success, + level: data.success ? "info" : "error", + module: "eom", + subModule: "lastPurchasePrice", + message: data.message, + data: + includePlantToken === "true" && data.success + ? data.data.map((i) => { + return { + plantToken: process.env.PROD_PLANT_TOKEN, + ...i, + //validDate: formatInTimeZone(i.validDate, "etc/utc", "M/d/yyyy"), + }; + }) + : data.data.map((i) => { + return { + ...i, + //validDate: formatInTimeZone(i.validDate, "etc/utc", "M/d/yyyy"), + }; + }), + notify: false, + status: data.success ? 200 : 400, + }); +}); + +export default r; diff --git a/backend/eom/eom.lastSalesPrice.route.ts b/backend/eom/eom.lastSalesPrice.route.ts new file mode 100644 index 0000000..42f64b8 --- /dev/null +++ b/backend/eom/eom.lastSalesPrice.route.ts @@ -0,0 +1,89 @@ +import { formatInTimeZone } from "date-fns-tz"; +import { Router } from "express"; +import { prodQuery } from "../prodSql/prodSqlQuery.controller.js"; +import { + type SqlQuery, + sqlQuerySelector, +} from "../prodSql/prodSqlQuerySelector.utils.js"; +import { apiReturn } from "../utils/returnHelper.utils.js"; +import { tryCatch } from "../utils/trycatch.utils.js"; + +const r = Router(); + +r.get("/", async (req, res) => { + const { date, includePlantToken } = req.query; + + if (!date || date === "") { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "lastSalesPrice", + message: "A date is required to run this query.", + data: [], + status: 400, + }); + } + const sqlQuery = sqlQuerySelector(`eom.lastSalesPrice`) as SqlQuery; + + if (!sqlQuery.success) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "lastSalesPrice", + message: + "Failed to get last sales price sql file please, please contact support if this continues.", + data: [], + status: 400, + }); + } + + const { data, error } = await tryCatch( + prodQuery( + sqlQuery.query.replace("[date]", date as string), + + "Eom last sales price data", + ), + ); + + if (error) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "lastSalesPrice", + message: `Error getting last Sales Price data info`, + data: error as any, + notify: false, + status: 400, + }); + } + + return apiReturn(res, { + success: data.success, + level: data.success ? "info" : "error", + module: "eom", + subModule: "lastSalesPrice", + message: data.message, + data: + includePlantToken === "true" && data.success + ? data.data.map((i) => { + return { + plantToken: process.env.PROD_PLANT_TOKEN, + ...i, + validDate: formatInTimeZone(i.validDate, "etc/utc", "M/d/yyyy"), + }; + }) + : data.data.map((i) => { + return { + ...i, + validDate: formatInTimeZone(i.validDate, "etc/utc", "M/d/yyyy"), + }; + }), + notify: false, + status: data.success ? 200 : 400, + }); +}); + +export default r; diff --git a/backend/eom/eom.productionConsumption.route.ts b/backend/eom/eom.productionConsumption.route.ts new file mode 100644 index 0000000..96bebb0 --- /dev/null +++ b/backend/eom/eom.productionConsumption.route.ts @@ -0,0 +1,98 @@ +import { formatInTimeZone } from "date-fns-tz"; +import { Router } from "express"; +import { prodQuery } from "../prodSql/prodSqlQuery.controller.js"; +import { + type SqlQuery, + sqlQuerySelector, +} from "../prodSql/prodSqlQuerySelector.utils.js"; +import { apiReturn } from "../utils/returnHelper.utils.js"; +import { tryCatch } from "../utils/trycatch.utils.js"; + +const r = Router(); + +r.get("/", async (req, res) => { + const { startDate, endDate, includePlantToken } = req.query; + + if (!startDate || startDate === "" || !endDate || endDate === "") { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "productionConsumption", + message: "The start date and end date are required to run this query.", + data: [], + status: 400, + }); + } + const sqlQuery = sqlQuerySelector(`eom.productionConsumption`) as SqlQuery; + + if (!sqlQuery.success) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "productionConsumption", + message: + "Failed to get production consumption sql file please, please contact support if this continues.", + data: [], + status: 400, + }); + } + + const { data, error } = await tryCatch( + prodQuery( + sqlQuery.query + .replace("[startDate]", startDate as string) + .replace("[endDate]", endDate as string), + "Eom production consumption data", + ), + ); + + if (error) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "productionConsumption", + message: `Error getting production consumption data info`, + data: error as any, + notify: false, + status: 400, + }); + } + + return apiReturn(res, { + success: data.success, + level: data.success ? "info" : "error", + module: "eom", + subModule: "productionConsumption", + message: data.message, + data: + includePlantToken === "true" && data.success + ? data.data.map((i) => { + return { + plantToken: process.env.PROD_PLANT_TOKEN, + ...i, + // Prod_Date: formatInTimeZone( + // i.Prod_Date, + // "etc/utc", + // "M/d/yyyy", + // ), + }; + }) + : data.data.map((i) => { + return { + ...i, + // Prod_Date: formatInTimeZone( + // i.Prod_Date, + // "etc/utc", + // "M/d/yyyy", + // ), + }; + }), + notify: false, + status: data.success ? 200 : 400, + }); +}); + +export default r; diff --git a/backend/eom/eom.purchased.route.ts b/backend/eom/eom.purchased.route.ts new file mode 100644 index 0000000..35f7159 --- /dev/null +++ b/backend/eom/eom.purchased.route.ts @@ -0,0 +1,98 @@ +import { formatInTimeZone } from "date-fns-tz"; +import { Router } from "express"; +import { prodQuery } from "../prodSql/prodSqlQuery.controller.js"; +import { + type SqlQuery, + sqlQuerySelector, +} from "../prodSql/prodSqlQuerySelector.utils.js"; +import { apiReturn } from "../utils/returnHelper.utils.js"; +import { tryCatch } from "../utils/trycatch.utils.js"; + +const r = Router(); + +r.get("/", async (req, res) => { + const { startDate, endDate, includePlantToken } = req.query; + + if (!startDate || startDate === "" || !endDate || endDate === "") { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "purchased", + message: "The start date and end date are required to run this query.", + data: [], + status: 400, + }); + } + const sqlQuery = sqlQuerySelector(`eom.purchased`) as SqlQuery; + + if (!sqlQuery.success) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "purchased", + message: + "Failed to get purchased sql file please, please contact support if this continues.", + data: [], + status: 400, + }); + } + + const { data, error } = await tryCatch( + prodQuery( + sqlQuery.query + .replace("[startDate]", startDate as string) + .replace("[endDate]", endDate as string), + "Eom purchased data", + ), + ); + + if (error) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "purchased", + message: `Error getting purchased data info`, + data: error as any, + notify: false, + status: 400, + }); + } + + return apiReturn(res, { + success: data.success, + level: data.success ? "info" : "error", + module: "eom", + subModule: "purchased", + message: data.message, + data: + includePlantToken === "true" && data.success + ? data.data.map((i) => { + return { + plantToken: process.env.PROD_PLANT_TOKEN, + ...i, + Received_Date: formatInTimeZone( + i.Received_Date, + "etc/utc", + "M/d/yyyy", + ), + }; + }) + : data.data.map((i) => { + return { + ...i, + Received_Date: formatInTimeZone( + i.Received_Date, + "etc/utc", + "M/d/yyyy", + ), + }; + }), + notify: false, + status: data.success ? 200 : 400, + }); +}); + +export default r; diff --git a/backend/eom/eom.regrind.route.ts b/backend/eom/eom.regrind.route.ts new file mode 100644 index 0000000..3672a46 --- /dev/null +++ b/backend/eom/eom.regrind.route.ts @@ -0,0 +1,98 @@ +import { formatInTimeZone } from "date-fns-tz"; +import { Router } from "express"; +import { prodQuery } from "../prodSql/prodSqlQuery.controller.js"; +import { + type SqlQuery, + sqlQuerySelector, +} from "../prodSql/prodSqlQuerySelector.utils.js"; +import { apiReturn } from "../utils/returnHelper.utils.js"; +import { tryCatch } from "../utils/trycatch.utils.js"; + +const r = Router(); + +r.get("/", async (req, res) => { + const { startDate, endDate, includePlantToken } = req.query; + + if (!startDate || startDate === "" || !endDate || endDate === "") { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "regrind", + message: "The start date and end date are required to run this query.", + data: [], + status: 400, + }); + } + const sqlQuery = sqlQuerySelector(`eom.regrind`) as SqlQuery; + + if (!sqlQuery.success) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "regrind", + message: + "Failed to get regrind sql file please, please contact support if this continues.", + data: [], + status: 400, + }); + } + + const { data, error } = await tryCatch( + prodQuery( + sqlQuery.query + .replace("[startDate]", startDate as string) + .replace("[endDate]", endDate as string), + "Eom regrind data", + ), + ); + + if (error) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "regrind", + message: `Error getting regrind data info`, + data: error as any, + notify: false, + status: 400, + }); + } + + return apiReturn(res, { + success: data.success, + level: data.success ? "info" : "error", + module: "eom", + subModule: "regrind", + message: data.message, + data: + includePlantToken === "true" && data.success + ? data.data.map((i) => { + return { + plantToken: process.env.PROD_PLANT_TOKEN, + ...i, + Buchungsdatum: formatInTimeZone( + i.Buchungsdatum, + "etc/utc", + "M/d/yyyy", + ), + }; + }) + : data.data.map((i) => { + return { + ...i, + Buchungsdatum: formatInTimeZone( + i.Buchungsdatum, + "etc/utc", + "M/d/yyyy", + ), + }; + }), + notify: false, + status: data.success ? 200 : 400, + }); +}); + +export default r; diff --git a/backend/eom/eom.routes.ts b/backend/eom/eom.routes.ts new file mode 100644 index 0000000..9c1e924 --- /dev/null +++ b/backend/eom/eom.routes.ts @@ -0,0 +1,35 @@ +import type { Express } from "express"; +import { featureCheck } from "../middleware/featureActive.middleware.js"; +import gpData from "./eom.gpdata.route.js"; +import historyInv from "./eom.historyInv.route.js"; +import lastPurchasePrice from "./eom.lastPurchasePrice.route.js"; +import lastSalesPrice from "./eom.lastSalesPrice.route.js"; +import productionConsumption from "./eom.productionConsumption.route.js"; +import purchased from "./eom.purchased.route.js"; +import regrind from "./eom.regrind.route.js"; +import soldItems from "./eom.soldItems.route.js"; + +export const setupEomRoutes = (baseUrl: string, app: Express) => { + //stats will be like this as we dont need to change this + + app.use(`${baseUrl}/api/eom/historyInv`, featureCheck("eom"), historyInv); + app.use(`${baseUrl}/api/eom/purchased`, featureCheck("eom"), purchased); + app.use( + `${baseUrl}/api/eom/lastSalesPrice`, + featureCheck("eom"), + lastSalesPrice, + ); + app.use( + `${baseUrl}/api/eom/lastPurchasePrice`, + featureCheck("eom"), + lastPurchasePrice, + ); + app.use( + `${baseUrl}/api/eom/productionConsumption`, + featureCheck("eom"), + productionConsumption, + ); + app.use(`${baseUrl}/api/eom/regrind`, featureCheck("eom"), regrind); + app.use(`${baseUrl}/api/eom/soldItems`, featureCheck("eom"), soldItems); + app.use(`${baseUrl}/api/eom/gpData`, featureCheck("eom"), gpData); +}; diff --git a/backend/eom/eom.soldItems.route.ts b/backend/eom/eom.soldItems.route.ts new file mode 100644 index 0000000..e28469e --- /dev/null +++ b/backend/eom/eom.soldItems.route.ts @@ -0,0 +1,98 @@ +import { formatInTimeZone } from "date-fns-tz"; +import { Router } from "express"; +import { prodQuery } from "../prodSql/prodSqlQuery.controller.js"; +import { + type SqlQuery, + sqlQuerySelector, +} from "../prodSql/prodSqlQuerySelector.utils.js"; +import { apiReturn } from "../utils/returnHelper.utils.js"; +import { tryCatch } from "../utils/trycatch.utils.js"; + +const r = Router(); + +r.get("/", async (req, res) => { + const { startDate, endDate, includePlantToken } = req.query; + + if (!startDate || startDate === "" || !endDate || endDate === "") { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "soldItems", + message: "The start date and end date are required to run this query.", + data: [], + status: 400, + }); + } + const sqlQuery = sqlQuerySelector(`eom.soldItems`) as SqlQuery; + + if (!sqlQuery.success) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "soldItems", + message: + "Failed to get soldItems sql file please, please contact support if this continues.", + data: [], + status: 400, + }); + } + + const { data, error } = await tryCatch( + prodQuery( + sqlQuery.query + .replace("[startDate]", startDate as string) + .replace("[endDate]", endDate as string), + "Eom soldItems data", + ), + ); + + if (error) { + return apiReturn(res, { + success: false, + level: "error", + module: "eom", + subModule: "soldItems", + message: `Error getting soldItems data info`, + data: error as any, + notify: false, + status: 400, + }); + } + + return apiReturn(res, { + success: data.success, + level: data.success ? "info" : "error", + module: "eom", + subModule: "soldItems", + message: data.message, + data: + includePlantToken === "true" && data.success + ? data.data.map((i) => { + return { + plantToken: process.env.PROD_PLANT_TOKEN, + ...i, + DeliveryDate: formatInTimeZone( + i.DeliveryDate, + "etc/utc", + "M/d/yyyy", + ), + }; + }) + : data.data.map((i) => { + return { + ...i, + DeliveryDate: formatInTimeZone( + i.DeliveryDate, + "etc/utc", + "M/d/yyyy", + ), + }; + }), + notify: false, + status: data.success ? 200 : 400, + }); +}); + +export default r; diff --git a/backend/gpSql/queries/gp.eom.data.sql b/backend/gpSql/queries/gp.eom.data.sql new file mode 100644 index 0000000..0901760 --- /dev/null +++ b/backend/gpSql/queries/gp.eom.data.sql @@ -0,0 +1,16 @@ +select * from ( + select + case when x.POPRCTNM is null then p.POPRCTNM else p.POPRCTNM end as RCT_Num, + PONUMBER PO, + p.VENDORID Supplier, + ITEMNMBR Item, + QTYSHPPD shipped, + UOFM Type, + TRXLOCTN Location, + case when CONVERT(DATE, x.receiptdate) is null then convert(date, p.DATERECD) else CONVERT(DATE, x.receiptdate) end as Date_Received + from ALPLA.dbo.pop10500 (nolock) as p + left join + ALPLA.dbo.POP10300 as x on p.POPRCTNM = x.POPRCTNM + WHERE TRXLOCTN LIKE '[gpCode]%' and p.POPTYPE = 1) a + + where Date_Received BETWEEN '[startDate]' AND '[endDate]' \ No newline at end of file diff --git a/backend/prodSql/queries/eom.lastPurchasePrice.sql b/backend/prodSql/queries/eom.lastPurchasePrice.sql new file mode 100644 index 0000000..df765ef --- /dev/null +++ b/backend/prodSql/queries/eom.lastPurchasePrice.sql @@ -0,0 +1,15 @@ +use AlplaPROD_test1 + +SELECT plant=(SELECT Wert FROM dbo.T_SystemParameter (nolock) WHERE (Bezeichnung = 'Werkskuerzel')), +plantName=(SELECT Wert FROM dbo.T_SystemParameter AS T_SystemParameter (nolock) WHERE (Bezeichnung = 'Mandant-intern')),* + from + (Select IdBestellung as 'Purchase order number', + IdArtikelVarianten AS AV, + BestellMenge, + BestellMengeVPK, + PreisProEinheit, + convert(varchar,Lieferdatum,23) as deliveryDate, + ROW_NUMBER() over(partition by IdArtikelVarianten order by Lieferdatum desc) rn +from dbo.V_Bestellpositionen_PURCHASE (nolock) + where PositionsStatus = '7' or PositionsStatus = '6' or PositionsStatus = '5' and convert(varchar,Lieferdatum,23) > DATEADD(year, -5, GetDate()) )a + where rn = 1 \ No newline at end of file diff --git a/backend/prodSql/queries/eom.lastSalesPrice.sql b/backend/prodSql/queries/eom.lastSalesPrice.sql new file mode 100644 index 0000000..fcc1cda --- /dev/null +++ b/backend/prodSql/queries/eom.lastSalesPrice.sql @@ -0,0 +1,14 @@ +use AlplaPROD_test1 + +select * from +(select IdArtikelvarianten as av, +VKPreis as salesPrice, +MPB, FWMPAlpla, +FWMPB, +ROW_NUMBER() over(partition by IdArtikelVarianten order by gueltigabdatum desc) rn, +convert(date, gueltigabdatum, 120) as validDate +from dbo.T_HistoryVK (nolock) +where convert(date, gueltigabdatum, 120) <= '[date]' and StandardKunde = 1) a +where rn =1 +order by av asc, +validDate desc \ No newline at end of file diff --git a/backend/prodSql/queries/eom.productionConsumption.sql b/backend/prodSql/queries/eom.productionConsumption.sql new file mode 100644 index 0000000..63214c4 --- /dev/null +++ b/backend/prodSql/queries/eom.productionConsumption.sql @@ -0,0 +1,7 @@ +use alplaprod_test1 + +SELECT IdArtikelvarianten AS AV, +Menge AS Quantity, +CONVERT(DATE, BuchDatum) AS Prod_Date +FROM dbo.T_LBW (nolock) +WHERE BuchDatum BETWEEN '[startDate]' AND '[endDate]' ORDER BY BuchDatum DESC \ No newline at end of file diff --git a/backend/prodSql/queries/eom.purchased.sql b/backend/prodSql/queries/eom.purchased.sql new file mode 100644 index 0000000..ffac7eb --- /dev/null +++ b/backend/prodSql/queries/eom.purchased.sql @@ -0,0 +1,40 @@ +use AlplaPROD_test1 + +declare @start_date nvarchar(30) = '[startDate] ' +declare @end_date nvarchar(30) = '[endDate] ' + +select T_Wareneingaenge.IdBestellung AS Purchase_order, + T_Adressen.IdAdressen, + T_Adressen.Bezeichnung, + T_Wareneingaenge.IdArtikelVarianten AS AV, + V_Artikel.Alias, + x.Bemerkung AS Remark, + T_Wareneingaenge.Bemerkung AS Purchase_Remark, + x.Add_User, + CONVERT(DATE, x.Add_Date) AS Received_Date, + x.IdWareneingangPlanung, + T_Wareneingaenge.SollMenge As Ordered_QTY, + x.EntladeMenge As Received_QTY, + case when T_Adressen.Bezeichnung LIKE '%Alpla%' Then 'AlplaPlant' Else 'Supplier' End AS + Supplier, + x.Typ as incoming_goods_type + from dbo.T_WareneingangPlanungen (nolock) as x + + join + + dbo.T_Wareneingaenge (nolock) on + x.IdWareneingang= + dbo.T_Wareneingaenge.IdWareneingang + join + dbo.V_Artikel (nolock) on + dbo.T_Wareneingaenge.IdArtikelVarianten= + dbo.V_Artikel.IdArtikelvarianten + + join + dbo.T_Adressen (nolock) on dbo.T_Wareneingaenge.IdLieferantAdresse = + dbo.T_Adressen.IdAdressen + + where x.add_date between @start_date + (select top(1) CONVERT(char(8), StartDate, 108) as startTime from [test1_AlplaPROD2.0_Read].masterData.ShiftDefinition (nolock) where TeamNumber = 1) + AND @end_date + (select top(1) CONVERT(char(8), StartDate, 108) as startTime from [test1_AlplaPROD2.0_Read].masterData.ShiftDefinition (nolock) where TeamNumber = 1) + + order by x.add_date desc \ No newline at end of file diff --git a/backend/prodSql/queries/eom.regrind.sql b/backend/prodSql/queries/eom.regrind.sql new file mode 100644 index 0000000..af6877e --- /dev/null +++ b/backend/prodSql/queries/eom.regrind.sql @@ -0,0 +1,13 @@ +select IdArtikelVarianten, +ArtikelVariantenAlias, +IdRezeptur, +Menge, +IdBuchungsGrund, +Buchungsdatum, +ProduktionsLos, +IdReinheit, +ReinheitBez, HerkunftBez +from alplaprod_test1.[dbo].[V_AbfallLagerBuchungen] (nolock) +where Buchungsdatum between '[startDate] ' + (select top(1) CONVERT(char(8), StartDate, 108) as startTime from [test1_AlplaPROD2.0_Read].masterData.ShiftDefinition (nolock) where TeamNumber = 1) +and '[endDate] ' + (select top(1) CONVERT(char(8), StartDate, 108) as startTime from [test1_AlplaPROD2.0_Read].masterData.ShiftDefinition (nolock) where TeamNumber = 1) +and IdBuchungsGrund in (140, 240) and BuchungsTyp = 1 \ No newline at end of file diff --git a/backend/prodSql/queries/eom.soldItems.sql b/backend/prodSql/queries/eom.soldItems.sql new file mode 100644 index 0000000..e432777 --- /dev/null +++ b/backend/prodSql/queries/eom.soldItems.sql @@ -0,0 +1,15 @@ +select IdArtikelVarianten AS AV, + ArtikelVariantenAlias AS AVDescription, + convert(date,AbrufLadeDatum,23) As DeliveryDate, + idlieferadresse AS DeliveryAddress, + LieferAdressBez, + AuftragsNummer AS PO_Number, + IdAuftragsPosition AS LineITEM, + IdAuftragsAbruf AS ReleaseNumber, + AbrufMengeVPK AS PalletsRequested, + AbrufMenge AS PiecesRequested, + GelieferteMengeVPK AS DeliveredPallets, + GelieferteMenge AS DeliveredQTY, + case when LieferAdressBez Like '%alpla%' Then 'AlplaPlant' ELSE 'Customer' End as CustomerType +from alplaprod_test1.dbo.V_TrackerAuftragsAbrufe (nolock) +where AbrufLadeDatum between '[startDate]' and '[endDate]' \ No newline at end of file diff --git a/backend/routeHandler.routes.ts b/backend/routeHandler.routes.ts index fc6a5ae..4c15db2 100644 --- a/backend/routeHandler.routes.ts +++ b/backend/routeHandler.routes.ts @@ -5,6 +5,7 @@ import { setupAuthRoutes } from "./auth/auth.routes.js"; import { setupApiDocsRoutes } from "./configs/scaler.config.js"; import { setupDatamartRoutes } from "./datamart/datamart.routes.js"; import { setupDockDoorRoutes } from "./dockdoorScanning/dockdoor.routes.js"; +import { setupEomRoutes } from "./eom/eom.routes.js"; import { setupGPSqlRoutes } from "./gpSql/gpSql.routes.js"; import { setupMobileRoutes } from "./mobile/mobile.routes.js"; import { setupNotificationRoutes } from "./notification/notification.routes.js"; @@ -31,4 +32,5 @@ export const setupRoutes = (baseUrl: string, app: Express) => { setupOCPRoutes(baseUrl, app); setupTCPRoutes(baseUrl, app); setupDockDoorRoutes(baseUrl, app); + setupEomRoutes(baseUrl, app); }; diff --git a/backend/system/settingsBase.controller.ts b/backend/system/settingsBase.controller.ts index 80dc001..aac87db 100644 --- a/backend/system/settingsBase.controller.ts +++ b/backend/system/settingsBase.controller.ts @@ -96,6 +96,16 @@ const newSettings: NewSetting[] = [ roles: ["admin"], seedVersion: 1, }, + { + name: "eom", + value: "0", + active: true, + description: "Eom processes to capture data", + moduleName: "eom", + settingType: "feature", + roles: ["admin"], + seedVersion: 1, + }, // standard settings { diff --git a/backend/utils/returnHelper.utils.ts b/backend/utils/returnHelper.utils.ts index f151baa..920ca98 100644 --- a/backend/utils/returnHelper.utils.ts +++ b/backend/utils/returnHelper.utils.ts @@ -17,7 +17,8 @@ export interface ReturnHelper { | "logistics" | "admin" | "mobile" - | "dockdoor"; + | "dockdoor" + | "eom"; subModule: string; level: "info" | "error" | "debug" | "fatal" | "warn";