Compare commits

...

12 Commits

16 changed files with 405 additions and 60 deletions

View File

@@ -5,6 +5,12 @@ import { useEffect } from "react";
const fetchSession = async () => {
const token = localStorage.getItem("auth_token");
//temp
localStorage.removeItem("ally-supports-cache");
localStorage.removeItem("auth-storage");
localStorage.removeItem("nextauth.message");
localStorage.removeItem("prod");
if (!token) {
throw new Error("No token found");
}

View File

@@ -8,7 +8,7 @@
"dev:frontend": "cd frontend && npm run dev",
"dev:dbgen": " drizzle-kit generate --config=drizzle-dev.config.ts",
"dev:dbmigrate": " drizzle-kit migrate --config=drizzle-dev.config.ts",
"build": "npm run build:server && npm run build:frontend",
"build": "npm run build:server && npm run build:frontend && npm run zipServer && npm run dev",
"build:server": "rimraf dist && tsc --build && npm run copy:scripts && xcopy server\\services\\notifications\\utils\\views\\ dist\\server\\services\\notifications\\utils\\views\\ /E /I /Y",
"build:frontend": "cd frontend && npm run build",
"copy:scripts": "tsx server/scripts/copyScripts.ts",
@@ -35,7 +35,7 @@
}
},
"admConfig": {
"build": 253,
"build": 260,
"oldBuild": "backend-0.1.3.zip"
},
"devDependencies": {

View File

@@ -2,8 +2,8 @@ param (
[string]$serviceName,
[string]$option,
[string]$appPath,
[string]$command, # just the command like run startadm or what ever you have in npm.
[string]$description
[string]$command, # just the command like run start or what ever you have in npm.
[string]$description,
[string]$remote
)
@@ -11,16 +11,6 @@ param (
# .\services.ps1 -serviceName "LSTV2" -option "install" -appPath "E:\LST\lstV2" -description "Logistics Support Tool V2" -command "run start"
### the fix
# .\services.ps1 -serviceName "LST-App" -option "delete" -appPath "E:\LST\lstV2" -description "Logistics Support Tool V2" -command "run start"
# .\services.ps1 -serviceName "LST-frontend" -option "delete" -appPath "E:\LST\lstV2" -description "Logistics Support Tool V2" -command "run start"
# .\services.ps1 -serviceName "LST-System" -option "delete" -appPath "E:\LST\lstV2" -description "Logistics Support Tool V2" -command "run start"
# .\services.ps1 -serviceName "LST-Gateway" -option "delete" -appPath "E:\LST\lstV2" -description "Logistics Support Tool V2" -command "run start"
# .\services.ps1 -serviceName "LST-App" -option "install" -appPath "E:\LST\lst_backend" -description "Logistics Support Tool V2" -command "run startapp"
# .\services.ps1 -serviceName "LST-frontend" -option "install" -appPath "E:\LST\lst_backend" -description "Logistics Support Tool V2" -command "run startfront"
$nssmPath = $AppPath + "\nssm.exe"
$npmPath = "C:\Program Files\nodejs\npm.cmd" # Path to npm.cmd
@@ -74,6 +64,30 @@ if ($option -eq "delete"){
}
if ($option -eq "prodStop"){
if(-not $appPath){
Write-host "The path to the app is missing please add it in and try again."
exit 1
}
& $nssmPath stop $serviceName
write-host "Removing $($serviceName)"
#& $nssmPath remove $serviceName confirm
sc.exe config $serviceName start= disabled
}
if ($option -eq "prodStart"){
if(-not $appPath){
Write-host "The path to the app is missing please add it in and try again."
exit 1
}
& $nssmPath start $serviceName
write-host "Removing $($serviceName)"
#& $nssmPath remove $serviceName confirm
sc.exe config $serviceName start= auto
}
if($option -eq "install"){
if(-not $appPath -or -not $description -or -not $command){
Write-host "Please check all parameters are passed to install the app.."

View File

@@ -119,29 +119,29 @@ $plantFunness = {
exit 1 # Exit with a non-zero code if there's an error
}
Write-Host "-----------------------Dealing with LSTv1 Stuff ------------------------------------"
try {
# Expand the archive
Expand-Archive -Path "$($localPath)\$($obsBuild)" -DestinationPath $obslst -Force
# Write-Host "-----------------------Dealing with LSTv1 Stuff ------------------------------------"
# try {
# # Expand the archive
# Expand-Archive -Path "$($localPath)\$($obsBuild)" -DestinationPath $obslst -Force
# Delete the zip file after extraction
Write-Host "Deleting the zip file..."
Remove-Item -Path "$($localPath)\$($obsBuild)" -Force
} catch {
Write-Host "Error: $_"
exit 1 # Exit with a non-zero code if there's an error
}
# # Delete the zip file after extraction
# Write-Host "Deleting the zip file..."
# Remove-Item -Path "$($localPath)\$($obsBuild)" -Force
# } catch {
# Write-Host "Error: $_"
# exit 1 # Exit with a non-zero code if there's an error
# }
# for iowa 2 need to change the port config on the start up of nextjs server
if($token -eq "usiow2"){
$jsonPkgloc = "$($obslst)\apps\frontend\package.json"
#read the file
$jsonContent = Get-Content -Path $jsonPkgloc | ConvertFrom-Json
#change the second we want to update
$jsonContent.scripts.start = "next start -p 3001"
# convert back to json
$jsonContent | ConvertTo-Json | Set-Content -Path $jsonPkgloc
}
# # for iowa 2 need to change the port config on the start up of nextjs server
# if($token -eq "usiow2"){
# $jsonPkgloc = "$($obslst)\apps\frontend\package.json"
# #read the file
# $jsonContent = Get-Content -Path $jsonPkgloc | ConvertFrom-Json
# #change the second we want to update
# $jsonContent.scripts.start = "next start -p 3001"
# # convert back to json
# $jsonContent | ConvertTo-Json | Set-Content -Path $jsonPkgloc
# }
############################################################################
Write-Host "Stopping the services to do the updates, pkgs and db changes."
@@ -426,15 +426,15 @@ try {
# Write-Host "Starting $($serviceGateway)"
# Start-Service -DisplayName $serviceGateway
# Start-Sleep -Seconds 1
#Write-Host "Starting $($serviceAuth)"
#Start-Service -DisplayName $serviceAuth
#Start-Sleep -Seconds 1
Write-Host "Starting $($serviceApp)"
Start-Service -DisplayName $serviceApp
Start-Sleep -Seconds 1
Write-Host "Starting $($serviceFrontEnd)"
Start-Service -DisplayName $serviceFrontEnd
Start-Sleep -Seconds 1
# Write-Host "Starting $($serviceAuth)"
# Start-Service -DisplayName $serviceAuth
# Start-Sleep -Seconds 1
# Write-Host "Starting $($serviceApp)"
# Start-Service -DisplayName $serviceApp
# Start-Sleep -Seconds 1
# Write-Host "Starting $($serviceFrontEnd)"
# Start-Service -DisplayName $serviceFrontEnd
# Start-Sleep -Seconds 1
Write-Host "Starting $( $serviceLstV2)"
Start-Service -DisplayName $serviceLstV2
Start-Sleep -Seconds 1

View File

@@ -0,0 +1,34 @@
import * as XLSX from "xlsx";
export const standardForCastTemplate = async () => {
/**
* Creates the standard Template for bulk orders in
*/
const headers = [
["CustomerArticleNumber", "Quantity", "RequirementDate", "CustomerID"],
];
// create a new workbook
const wb = XLSX.utils.book_new();
const ws = XLSX.utils.aoa_to_sheet(headers);
//const ws2 = XLSX.utils.aoa_to_sheet(headers2);
const columnWidths = headers[0].map((header) => ({
width: header.length + 2,
}));
ws["!cols"] = columnWidths;
// append the worksheet to the workbook
XLSX.utils.book_append_sheet(wb, ws, `Sheet1`);
//XLSX.utils.book_append_sheet(wb, ws2, `Sheet2`);
// Write the excel file and trigger the download'
XLSX.writeFile(wb, "BulkForecastTemplate");
// Write the workbook to a buffer and return it
const excelBuffer = XLSX.write(wb, { bookType: "xlsx", type: "buffer" });
return excelBuffer;
};

View File

@@ -0,0 +1,38 @@
import { standardForecast } from "./mappings/standardForcast.js";
export const forecastIn = async (data: any, user: any) => {
/**
* Bulk orders in, and custom file parsing.
*/
let success = true;
let message = "";
let orderData: any = [];
// what type of order are we dealing with?
if (data["fileType"] === "standard") {
//run the standard forecast in
const standard = await standardForecast(data["postPostForecast"], user);
success = standard.success ?? false;
message = standard.message ?? "Error posting standard forecast";
orderData = standard.data;
}
if (data["fileType"] === "energizer") {
// orders in
}
if (data["fileType"] === "loreal") {
// orders in
}
if (data["fileType"] === "pg") {
// orders in
}
return {
success,
message,
data: orderData,
};
};

View File

@@ -0,0 +1,11 @@
export const standardForecast = async (data: any, user: any) => {
/**
* Post a standard forecast based on the standard template.
*/
return {
success: true,
message: "Forecast Posted",
data: [],
};
};

View File

@@ -0,0 +1,75 @@
import axios from "axios";
import { prodEndpointCreation } from "../../../../../globalUtils/createUrl.js";
import { createLog } from "../../../../logger/logger.js";
export const postForecast = async (data: any, user: any) => {
let endpoint = await prodEndpointCreation(
"/public/v1.0/DemandManagement/DELFOR"
);
//console.log(endpoint);
//console.log(req.body.orders[0]);
try {
const results = await axios({
url: endpoint,
method: "POST",
headers: {
Authorization: `Basic ${user.prod}`,
},
// if a body is sent over it would be like below
data: data,
});
//console.log(results.data);
//console.log(results.status);
if (results.data.errors) {
createLog(
"error",
"forecast",
"logistics",
`There was an error posting the Forecast: ${JSON.stringify(
results.data.errors
)}`
);
return {
success: true,
message: "Error processing forecast",
data: results.data.errors[0].message,
};
}
if (results.status === 200) {
createLog(
"info",
"forecast",
"logistics",
`Forcast was successfully posted: ${JSON.stringify(
results.data
)}`
);
return {
success: true,
message: "Success on posting forecast",
data: results.data,
};
}
} catch (error: any) {
//console.log(`There is an error`, error);
if (error) {
//console.log(error.response.data);
createLog(
"error",
"forecast",
"logistics",
`There was an error posting the Forecast: ${JSON.stringify(
error.response.data
)}`
);
return {
success: false,
message: "There was an error posting the Forecast",
data: error.response.data,
};
}
}
};

View File

@@ -50,6 +50,7 @@ export const standardOrders = async (data: any, user: any) => {
};
}
const plantToken = s.filter((s) => s.name === "plantToken");
const arrayBuffer = await data.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
@@ -110,11 +111,15 @@ export const standardOrders = async (data: any, user: any) => {
// map everything out for each order
const nOrder = newOrders.map((o: any) => {
const invoice = i.filter(
(i: any) => i.deliveryAddress === parseInt(customerID)
);
if (!invoice) {
return;
}
return {
customerId: parseInt(customerID),
invoiceAddressId: i.filter(
(i: any) => i.deliveryAddress === parseInt(customerID)
)[0].invoiceAddress, // matched to the default invoice address
invoiceAddressId: invoice[0].invoiceAddress, // matched to the default invoice address
customerOrderNo: o.CustomerOrderNumber,
orderDate: new Date(Date.now()).toLocaleString("en-US"),
positions: [
@@ -143,8 +148,10 @@ export const standardOrders = async (data: any, user: any) => {
postedOrders.push({
customer: customerID,
//totalOrders: orders?.length(),
success: posting.success,
message: posting.message,
data: posting.data,
});
}

View File

@@ -1,5 +1,5 @@
import { abbottOrders } from "./customMappings/abbottTruckList.js";
import { standardOrders } from "./customMappings/standardOrders.js";
import { abbottOrders } from "./mappings/abbottTruckList.js";
import { standardOrders } from "./mappings/standardOrders.js";
export const ordersIn = async (data: any, user: any) => {
/**
@@ -15,7 +15,7 @@ export const ordersIn = async (data: any, user: any) => {
// run the standard orders in
const standard = await standardOrders(data["postOrders"], user);
success = standard.success ?? false;
message = standard.message ?? "Error posting Abbott Orders";
message = standard.message ?? "Error posting Standard Orders";
orderData = standard.data;
}

View File

@@ -13,6 +13,8 @@ import getPPOO from "./route/getPPOO.js";
import getcyclecount from "./route/getCycleCountLanes.js";
import postBulkOrders from "./route/dm/bulkOrdersIn.js";
import standardTemplate from "./route/dm/getStandardTemplate.js";
import standardForcasttemplate from "./route/dm/getStandardForecastTemplate.js";
import postForecast from "./route/dm/forecastIn.js";
const app = new OpenAPIHono();
@@ -33,6 +35,8 @@ const routes = [
//DM
postBulkOrders,
standardTemplate,
postForecast,
standardForcasttemplate,
] as const;
// app.route("/server", modules);

View File

@@ -2,6 +2,7 @@ import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
import { responses } from "../../../../globalUtils/routeDefs/responses.js";
import { ordersIn } from "../../controller/dm/ordersIn/ordersIn.js";
import { verify } from "hono/jwt";
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
const app = new OpenAPIHono();
@@ -39,19 +40,34 @@ app.openapi(
// if (body["fileType"] === "standard") {
// console.log(`doing standard orders in.`);
// }
try {
const payload = await verify(token, process.env.JWT_SECRET!);
const orders = await ordersIn(body, payload.user);
const { data: payload, error: pe } = await tryCatch(
verify(token, process.env.JWT_SECRET!)
);
return c.json({
success: orders.success,
message: orders.message,
data: orders.data,
});
} catch (error) {
console.log(error);
if (pe) {
return c.json({ success: false, message: "Unauthorized" }, 401);
}
const { data: orders, error } = await tryCatch(
ordersIn(body, payload.user)
);
if (error) {
return c.json(
{
success: false,
message: "Error posting forecast",
data: error,
},
400
);
}
return c.json({
success: orders?.success ?? false,
message: orders?.message ?? "Error posting forecast",
data: orders?.data ?? [],
});
}
);
export default app;

View File

@@ -0,0 +1,74 @@
import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
import { responses } from "../../../../globalUtils/routeDefs/responses.js";
import { ordersIn } from "../../controller/dm/ordersIn/ordersIn.js";
import { verify } from "hono/jwt";
import { forecastIn } from "../../controller/dm/forecast/forecastIn.js";
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
const app = new OpenAPIHono();
// const Body = z
// .object({
// age: z.number().optional().openapi({ example: 90 }),
// //email: z.string().optional().openapi({example: "s.smith@example.com"}),
// type: z.string().optional().openapi({ example: "fg" }),
// })
// .openapi("User");
app.openapi(
createRoute({
tags: ["logistics"],
summary: "Post forecast to DM",
method: "post",
path: "/postforecastin",
// request: {
// body: {
// content: {
// "application/json": { schema: Body },
// },
// },
// },
// description:
// "Provided a running number and lot number you can consume material.",
responses: responses(),
}),
async (c) => {
//apiHit(c, { endpoint: "api/sqlProd/close" });
const body = await c.req.parseBody();
const authHeader = c.req.header("Authorization");
const token = authHeader?.split("Bearer ")[1] || "";
//console.log(body); // File | string
// if (body["fileType"] === "standard") {
// console.log(`doing standard orders in.`);
// }
const { data: payload, error: pe } = await tryCatch(
verify(token, process.env.JWT_SECRET!)
);
if (pe) {
return c.json({ success: false, message: "Unauthorized" }, 401);
}
const { data: orders, error } = await tryCatch(
forecastIn(body, payload.user)
);
if (error) {
return c.json(
{
success: false,
message: "Error posting forecast",
data: error,
},
400
);
}
return c.json({
success: orders?.success ?? false,
message: orders?.message ?? "Error posting forecast",
data: orders?.data ?? [],
});
}
);
export default app;

View File

@@ -0,0 +1,66 @@
import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
import { format } from "date-fns";
import { responses } from "../../../../globalUtils/routeDefs/responses.js";
import { standardTemplate } from "../../controller/dm/ordersIn/createTemplate.js";
import { tryCatch } from "../../../../globalUtils/tryCatch.js";
import { standardForCastTemplate } from "../../controller/dm/forecast/createTemplate.js";
const app = new OpenAPIHono();
// const Body = z
// .object({
// age: z.number().optional().openapi({ example: 90 }),
// //email: z.string().optional().openapi({example: "s.smith@example.com"}),
// type: z.string().optional().openapi({ example: "fg" }),
// })
// .openapi("User");
app.openapi(
createRoute({
tags: ["logistics"],
summary: "Gets the standard Forecast Template",
method: "get",
path: "/bulkforcasttemplate",
// request: {
// body: {
// content: {
// "application/json": { schema: Body },
// },
// },
// },
// description:
// "Provided a running number and lot number you can consume material.",
responses: responses(),
}),
async (c: any) => {
//apiHit(c, { endpoint: "api/sqlProd/close" });
const defaultFilename = `bulkForcastTemplate-${format(
new Date(Date.now()),
"M-d-yyyy"
)}.xlsx`;
const filename = c.req.query("filename") || defaultFilename;
const { data, error } = await tryCatch(standardForCastTemplate());
if (error) {
return c.json({
success: false,
message: "Error creating template",
data: error,
});
}
return new Response(data, {
headers: {
"Content-Type":
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"Content-Disposition": `attachment; filename="${filename}"`,
},
});
// return c.json({
// success: data.success,
// message: data.message,
// data: data.data,
// });
}
);
export default app;