221 lines
5.7 KiB
TypeScript
221 lines
5.7 KiB
TypeScript
import { format } from "date-fns";
|
|
import { eq, sql } from "drizzle-orm";
|
|
import { runDatamartQuery } from "../datamart/datamart.controller.js";
|
|
import { db } from "../db/db.controller.js";
|
|
import { invHistoricalData } from "../db/schema/historicalInv.schema.js";
|
|
import { prodQuery } from "../prodSql/prodSqlQuery.controller.js";
|
|
import {
|
|
type SqlQuery,
|
|
sqlQuerySelector,
|
|
} from "../prodSql/prodSqlQuerySelector.utils.js";
|
|
import { createCronJob } from "../utils/croner.utils.js";
|
|
import { returnFunc } from "../utils/returnHelper.utils.js";
|
|
import { tryCatch } from "../utils/trycatch.utils.js";
|
|
|
|
type Inventory = {
|
|
article: string;
|
|
alias: string;
|
|
materialType: string;
|
|
total_palletQTY: string;
|
|
available_QTY: string;
|
|
coa_QTY: string;
|
|
held_QTY: string;
|
|
consignment_qty: string;
|
|
lot: string;
|
|
locationId: string;
|
|
laneDescription: string;
|
|
warehouseId: string;
|
|
warehouseDescription: string;
|
|
};
|
|
|
|
const historicalInvImport = async () => {
|
|
const today = new Date();
|
|
const { data, error } = await tryCatch(
|
|
db
|
|
.select()
|
|
.from(invHistoricalData)
|
|
.where(eq(invHistoricalData.histDate, format(today, "yyyy-MM-dd"))),
|
|
);
|
|
|
|
if (error) {
|
|
return returnFunc({
|
|
success: false,
|
|
level: "error",
|
|
module: "system",
|
|
subModule: "query",
|
|
message: `Error getting historical inv info`,
|
|
data: error as any,
|
|
notify: false,
|
|
});
|
|
}
|
|
|
|
if (data?.length === 0) {
|
|
const avSQLQuery = sqlQuerySelector(`datamart.activeArticles`) as SqlQuery;
|
|
|
|
if (!avSQLQuery.success) {
|
|
return returnFunc({
|
|
success: false,
|
|
level: "error",
|
|
module: "logistics",
|
|
subModule: "inv",
|
|
message: `Error getting Article info`,
|
|
data: [avSQLQuery.message],
|
|
notify: true,
|
|
});
|
|
}
|
|
|
|
const { data: inv, error: invError } = await tryCatch(
|
|
//prodQuery(sqlQuery.query, "Inventory data"),
|
|
runDatamartQuery({ name: "inventory", options: { historical: "x" } }),
|
|
);
|
|
|
|
const { data: av, error: avError } = (await tryCatch(
|
|
runDatamartQuery({ name: "activeArticles", options: {} }),
|
|
)) as any;
|
|
|
|
if (invError) {
|
|
return returnFunc({
|
|
success: false,
|
|
level: "error",
|
|
module: "logistics",
|
|
subModule: "inv",
|
|
message: `Error getting inventory info from prod query`,
|
|
data: invError as any,
|
|
notify: false,
|
|
});
|
|
}
|
|
|
|
if (avError) {
|
|
return returnFunc({
|
|
success: false,
|
|
level: "error",
|
|
module: "logistics",
|
|
subModule: "inv",
|
|
message: `Error getting article info from prod query`,
|
|
data: invError as any,
|
|
notify: false,
|
|
});
|
|
}
|
|
|
|
// shape the data to go into our table
|
|
const plantToken = process.env.PROD_PLANT_TOKEN ?? "test1";
|
|
const importInv = (inv.data ? inv.data : []) as Inventory[];
|
|
const importData = importInv.map((i) => {
|
|
return {
|
|
histDate: sql`(NOW())::date`,
|
|
plantToken: plantToken,
|
|
article: i.article,
|
|
articleDescription: i.alias,
|
|
materialType:
|
|
av.data.filter((a: any) => a.article === i.article).length > 0
|
|
? av.data.filter((a: any) => a.article === i.article)[0]
|
|
?.TypeOfMaterial
|
|
: "Item not defined",
|
|
total_QTY: i.total_palletQTY ?? "0.00",
|
|
available_QTY: i.available_QTY ?? "0.00",
|
|
coa_QTY: i.coa_QTY ?? "0.00",
|
|
held_QTY: i.held_QTY ?? "0.00",
|
|
consignment_QTY: i.consignment_qty ?? "0.00",
|
|
lot_Number: i.lot ?? "0",
|
|
locationId: i.locationId ?? "0",
|
|
location: i.laneDescription ?? "Missing lane",
|
|
whseId: i.warehouseId ?? "0",
|
|
whseName: i.warehouseDescription ?? "Missing warehouse",
|
|
};
|
|
});
|
|
|
|
const { data: dataImport, error: errorImport } = await tryCatch(
|
|
db.insert(invHistoricalData).values(importData),
|
|
);
|
|
|
|
if (errorImport) {
|
|
return returnFunc({
|
|
success: false,
|
|
level: "error",
|
|
module: "logistics",
|
|
subModule: "inv",
|
|
message: `Error adding historical data to lst db`,
|
|
data: errorImport as any,
|
|
notify: true,
|
|
});
|
|
}
|
|
|
|
if (dataImport) {
|
|
return returnFunc({
|
|
success: false,
|
|
level: "info",
|
|
module: "logistics",
|
|
subModule: "inv",
|
|
message: `Historical data was added to lst :D`,
|
|
data: [],
|
|
notify: false,
|
|
});
|
|
}
|
|
} else {
|
|
return returnFunc({
|
|
success: false,
|
|
level: "info",
|
|
module: "logistics",
|
|
subModule: "inv",
|
|
message: `Historical Data for: ${format(today, "yyyy-MM-dd")}, is already added and nothing to do.`,
|
|
data: [],
|
|
notify: false,
|
|
});
|
|
}
|
|
|
|
return returnFunc({
|
|
success: false,
|
|
level: "info",
|
|
module: "logistics",
|
|
subModule: "inv",
|
|
message: `Some weird crazy error just happened and didnt get captured during the historical inv check.`,
|
|
data: [],
|
|
notify: true,
|
|
});
|
|
};
|
|
|
|
export const historicalSchedule = async () => {
|
|
// running the history in case my silly ass dose an update around the shift change time lol, this will prevent loss data. it might be off a little but no one cares
|
|
historicalInvImport();
|
|
|
|
const sqlQuery = sqlQuerySelector(`shiftChange`) as SqlQuery;
|
|
|
|
if (!sqlQuery.success) {
|
|
return returnFunc({
|
|
success: false,
|
|
level: "error",
|
|
module: "logistics",
|
|
subModule: "query",
|
|
message: `Error getting shiftChange sql file`,
|
|
data: [sqlQuery.message],
|
|
notify: false,
|
|
});
|
|
}
|
|
|
|
const { data, error } = await tryCatch(
|
|
prodQuery(sqlQuery.query, "Shift Change data"),
|
|
);
|
|
|
|
if (error) {
|
|
return returnFunc({
|
|
success: false,
|
|
level: "error",
|
|
module: "logistics",
|
|
subModule: "query",
|
|
message: `Error getting shiftChange info`,
|
|
data: error as any,
|
|
notify: false,
|
|
});
|
|
}
|
|
// shift split
|
|
const shiftTimeSplit = data?.data[0]?.shiftChange.split(":");
|
|
|
|
const cronSetup = `0 ${
|
|
shiftTimeSplit?.length > 0 ? `${parseInt(shiftTimeSplit[1])}` : "0"
|
|
} ${
|
|
shiftTimeSplit?.length > 0 ? `${parseInt(shiftTimeSplit[0])}` : "7"
|
|
} * * *`;
|
|
|
|
createCronJob("historicalInv", cronSetup, () => historicalInvImport());
|
|
};
|