feat(logistics): added in return material by lane name and gets lane id
This commit is contained in:
101
server/services/logistics/controller/returnMaterial.ts
Normal file
101
server/services/logistics/controller/returnMaterial.ts
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
import { ConsoleLogWriter } from "drizzle-orm";
|
||||||
|
import { prodEndpointCreation } from "../../../globalUtils/createUrl.js";
|
||||||
|
import { createLog } from "../../logger/logger.js";
|
||||||
|
import { query } from "../../sqlServer/prodSqlServer.js";
|
||||||
|
import { labelData } from "../../sqlServer/querys/materialHelpers/labelInfo.js";
|
||||||
|
import axios from "axios";
|
||||||
|
import { laneInfo } from "../../sqlServer/querys/materialHelpers/laneInfo.js";
|
||||||
|
import { tryCatch } from "../../../globalUtils/tryCatch.js";
|
||||||
|
|
||||||
|
type Data = {
|
||||||
|
runningNr: string;
|
||||||
|
laneName: string;
|
||||||
|
};
|
||||||
|
export const returnMaterial = async (data: Data, prod: any) => {
|
||||||
|
const { runningNr, laneName } = data;
|
||||||
|
// replace the rn
|
||||||
|
const rnReplace = labelData.replaceAll("[rn]", runningNr);
|
||||||
|
|
||||||
|
// get the lane id by name
|
||||||
|
const laneQuery = laneInfo.replaceAll("[laneName]", laneName);
|
||||||
|
let barcode;
|
||||||
|
// get the barcode from the running number
|
||||||
|
try {
|
||||||
|
barcode = await query(rnReplace, "labelData");
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
createLog(
|
||||||
|
"error",
|
||||||
|
prod.user.username,
|
||||||
|
"logistics",
|
||||||
|
`Error getting barcode: ${error}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data: laneData, error: laneError } = await tryCatch(
|
||||||
|
query(laneQuery, "laneInfo")
|
||||||
|
);
|
||||||
|
|
||||||
|
if (laneError) {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
message:
|
||||||
|
"The lane you entered is either deactivated or dose not exist.",
|
||||||
|
laneError,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (laneData) {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
message:
|
||||||
|
"The lane you entered is either deactivated or dose not exist.",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (laneData.length === 0) {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
message:
|
||||||
|
"The lane you entered is either deactivated or dose not exist.",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (barcode.length === 0) {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
message: "The running number you've is not in stock.",
|
||||||
|
};
|
||||||
|
//throw Error("The provided runningNr is not in stock");
|
||||||
|
}
|
||||||
|
// create the url to post
|
||||||
|
const url = await prodEndpointCreation(
|
||||||
|
"/public/v1.0/IssueMaterial/ReturnPartiallyConsumedManualMaterial"
|
||||||
|
);
|
||||||
|
|
||||||
|
const returnSomething = {
|
||||||
|
laneId: laneData[0]?.laneID,
|
||||||
|
barcode: barcode[0]?.barcode,
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const results = await axios.post(url, returnSomething, {
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
Authorization: `Basic ${prod.user.prod}`,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
//console.log(results);
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
message: "Material was returned",
|
||||||
|
status: results.status,
|
||||||
|
};
|
||||||
|
} catch (error: any) {
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
status: 200,
|
||||||
|
message: error.response?.data.errors[0].message,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
import {OpenAPIHono} from "@hono/zod-openapi";
|
import { OpenAPIHono } from "@hono/zod-openapi";
|
||||||
|
|
||||||
import comsumeMaterial from "./route/consumeMaterial.js";
|
import comsumeMaterial from "./route/consumeMaterial.js";
|
||||||
|
import returnMat from "./route/returnMaterial.js";
|
||||||
const app = new OpenAPIHono();
|
const app = new OpenAPIHono();
|
||||||
|
|
||||||
const routes = [comsumeMaterial] as const;
|
const routes = [comsumeMaterial, returnMat] as const;
|
||||||
|
|
||||||
// app.route("/server", modules);
|
// app.route("/server", modules);
|
||||||
const appRoutes = routes.forEach((route) => {
|
const appRoutes = routes.forEach((route) => {
|
||||||
|
|||||||
70
server/services/logistics/route/returnMaterial.ts
Normal file
70
server/services/logistics/route/returnMaterial.ts
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi";
|
||||||
|
import { authMiddleware } from "../../auth/middleware/authMiddleware.js";
|
||||||
|
import { apiHit } from "../../../globalUtils/apiHits.js";
|
||||||
|
import { verify } from "hono/jwt";
|
||||||
|
import { returnMaterial } from "../controller/returnMaterial.js";
|
||||||
|
|
||||||
|
const app = new OpenAPIHono();
|
||||||
|
|
||||||
|
const responseSchema = z.object({
|
||||||
|
success: z.boolean().optional().openapi({ example: true }),
|
||||||
|
message: z.string().optional().openapi({ example: "user access" }),
|
||||||
|
});
|
||||||
|
|
||||||
|
app.openapi(
|
||||||
|
createRoute({
|
||||||
|
tags: ["logistics"],
|
||||||
|
summary: "Retrns material based on its running number and laneName",
|
||||||
|
method: "post",
|
||||||
|
path: "/return",
|
||||||
|
middleware: authMiddleware,
|
||||||
|
description:
|
||||||
|
"Provided a running number and Lane to return the material.",
|
||||||
|
responses: {
|
||||||
|
200: {
|
||||||
|
content: { "application/json": { schema: responseSchema } },
|
||||||
|
description: "stopped",
|
||||||
|
},
|
||||||
|
400: {
|
||||||
|
content: { "application/json": { schema: responseSchema } },
|
||||||
|
description: "Failed to stop",
|
||||||
|
},
|
||||||
|
401: {
|
||||||
|
content: { "application/json": { schema: responseSchema } },
|
||||||
|
description: "Failed to stop",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
async (c) => {
|
||||||
|
apiHit(c, { endpoint: "api/sqlProd/close" });
|
||||||
|
const authHeader = c.req.header("Authorization");
|
||||||
|
const token = authHeader?.split("Bearer ")[1] || "";
|
||||||
|
|
||||||
|
try {
|
||||||
|
const payload = await verify(token, process.env.JWT_SECRET!);
|
||||||
|
try {
|
||||||
|
//return apiReturn(c, true, access?.message, access?.data, 200);
|
||||||
|
const data = await c.req.json();
|
||||||
|
const consume = await returnMaterial(data, payload);
|
||||||
|
return c.json(
|
||||||
|
{ success: consume?.success, message: consume?.message },
|
||||||
|
200
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
//console.log(error);
|
||||||
|
//return apiReturn(c, false, "Error in setting the user access", error, 400);
|
||||||
|
return c.json(
|
||||||
|
{
|
||||||
|
success: false,
|
||||||
|
message: "Missing data please try again",
|
||||||
|
error,
|
||||||
|
},
|
||||||
|
400
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
return c.json({ success: false, message: "Unauthorized" }, 401);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
export default app;
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
export const laneInfo = `
|
||||||
|
select IdLagerAbteilung as laneID,
|
||||||
|
Bezeichnung as laneName
|
||||||
|
from AlplaPROD_test1.dbo.T_LagerAbteilungen
|
||||||
|
where Aktiv = 1
|
||||||
|
and Bezeichnung = [laneName]
|
||||||
|
`;
|
||||||
Reference in New Issue
Block a user