From a19b03b8bfdac7114e61c8590e446d290f87e365 Mon Sep 17 00:00:00 2001 From: Blake Matthes Date: Thu, 30 Oct 2025 10:24:22 -0500 Subject: [PATCH] refactor(lottransfer): formatting changes --- .../ocp/controller/materials/lotTransfer.ts | 708 +++++++++--------- 1 file changed, 353 insertions(+), 355 deletions(-) diff --git a/lstV2/server/services/ocp/controller/materials/lotTransfer.ts b/lstV2/server/services/ocp/controller/materials/lotTransfer.ts index 7bb23fa..e1c5e6f 100644 --- a/lstV2/server/services/ocp/controller/materials/lotTransfer.ts +++ b/lstV2/server/services/ocp/controller/materials/lotTransfer.ts @@ -1,31 +1,31 @@ +import { format, formatDuration, intervalToDuration } from "date-fns"; import { eq } from "drizzle-orm"; +import { success } from "zod/v4"; import { db } from "../../../../../database/dbclient.js"; import { printerData } from "../../../../../database/schema/printers.js"; import { runProdApi } from "../../../../globalUtils/runProdApi.js"; import { tryCatch } from "../../../../globalUtils/tryCatch.js"; import { createLog } from "../../../logger/logger.js"; import { query } from "../../../sqlServer/prodSqlServer.js"; -import { labelInfo } from "../../../sqlServer/querys/warehouse/labelInfo.js"; -import { format, formatDuration, intervalToDuration } from "date-fns"; import { shiftChange } from "../../../sqlServer/querys/misc/shiftChange.js"; -import { success } from "zod/v4"; +import { labelInfo } from "../../../sqlServer/querys/warehouse/labelInfo.js"; type NewLotData = { - runningNumber: number; - lotNumber: number; - originalAmount: number; - level: number; - amount: number; - type: "lot" | "eom"; + runningNumber: number; + lotNumber: number; + originalAmount: number; + level: number; + amount: number; + type: "lot" | "eom"; }; interface PendingJob { - timeoutId: NodeJS.Timeout; - runningNumber: string | number; - data: any; - consumeLot: any; - newQty: any; - scheduledFor: Date; + timeoutId: NodeJS.Timeout; + runningNumber: string | number; + data: any; + consumeLot: any; + newQty: any; + scheduledFor: Date; } export const pendingJobs = new Map(); @@ -42,385 +42,383 @@ export const pendingJobs = new Map(); * type what way are we lots */ export const lotMaterialTransfer = async (data: NewLotData) => { - // check if we already have this running number scheduled - if (pendingJobs.has(data.runningNumber)) { - const job = pendingJobs.get(data.runningNumber) as PendingJob; + // check if we already have this running number scheduled + if (pendingJobs.has(data.runningNumber)) { + const job = pendingJobs.get(data.runningNumber) as PendingJob; - const duration = intervalToDuration({ - start: new Date(), - end: job.scheduledFor, - }); - createLog( - "error", - "materials", - "ocp", - `${ - data.runningNumber - } is pending to be transfered already, remaining time ${formatDuration( - duration, - { format: ["hours", "minutes", "seconds"] } - )}` - ); - return { - success: false, - message: `${ - data.runningNumber - } is pending to be transfered already, remaining time ${formatDuration( - duration, - { format: ["hours", "minutes", "seconds"] } - )}`, - data: [], - }; - } - // get the shift time - const { data: shift, error: shiftError } = (await tryCatch( - query(shiftChange, "shift change from material.") - )) as any; + const duration = intervalToDuration({ + start: new Date(), + end: job.scheduledFor, + }); + createLog( + "error", + "materials", + "ocp", + `${ + data.runningNumber + } is pending to be transfered already, remaining time ${formatDuration( + duration, + { format: ["hours", "minutes", "seconds"] }, + )}`, + ); + return { + success: false, + message: `${ + data.runningNumber + } is pending to be transfered already, remaining time ${formatDuration( + duration, + { format: ["hours", "minutes", "seconds"] }, + )}`, + data: [], + }; + } + // get the shift time + const { data: shift, error: shiftError } = (await tryCatch( + query(shiftChange, "shift change from material."), + )) as any; - if (shiftError) { - createLog( - "error", - "materials", - "ocp", - "There was an error getting the shift times will use fallback times" - ); - } + if (shiftError) { + createLog( + "error", + "materials", + "ocp", + "There was an error getting the shift times will use fallback times", + ); + } - // shift split - const shiftTimeSplit = shift?.data[0]?.shiftChange.split(":"); - console.log(parseInt(shiftTimeSplit[0]) - 1); - // Current time - const now = new Date(); + // shift split + const shiftTimeSplit = shift?.data[0]?.shiftChange.split(":"); + console.log(parseInt(shiftTimeSplit[0]) - 1); + // Current time + const now = new Date(); - // Target time: today at 06:35 - const target = new Date( - now.getFullYear(), - now.getMonth(), - 1, //now.getDate(), - shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[0]) : 5, // this will parse the hour to remove teh zero - shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[1]) : 3, - 0, - 0 - ); + // Target time: today at 06:35 + const target = new Date( + now.getFullYear(), + now.getMonth(), + 1, //now.getDate(), + shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[0]) : 5, // this will parse the hour to remove teh zero + shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[1]) : 3, + 0, + 0, + ); - console.log("target", target.toLocaleString(), "Now", now.toLocaleString()); + console.log("target", target.toLocaleString(), "Now", now.toLocaleString()); - // to early time - const early = new Date( - now.getFullYear(), - now.getMonth(), - 1, //now.getDate(), - shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[0]) - 1 : 5, // this will parse the hour to remove teh zero - shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[1]) : 0, - 0, - 0 - ); + // to early time + const early = new Date( + now.getFullYear(), + now.getMonth(), + 1, //now.getDate(), + shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[0]) - 1 : 5, // this will parse the hour to remove teh zero + shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[1]) : 0, + 0, + 0, + ); - console.log("early", early.toLocaleString(), "Now", now.toLocaleString()); + console.log("early", early.toLocaleString(), "Now", now.toLocaleString()); - // next month just to be here - const nextMonth = new Date( - now.getFullYear(), - now.getMonth() + 1, - 1, //now.getDate(), - shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[0]) - 1 : 5, // this will parse the hour to remove teh zero - shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[1]) : 0, - 0, - 0 - ); + // next month just to be here + const nextMonth = new Date( + now.getFullYear(), + now.getMonth() + 1, + 1, //now.getDate(), + shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[0]) - 1 : 5, // this will parse the hour to remove teh zero + shiftTimeSplit.length > 0 ? parseInt(shiftTimeSplit[1]) : 0, + 0, + 0, + ); - console.log( - "nextMonth", - nextMonth.toLocaleString(), - "Now", - now.toLocaleString() - ); + console.log( + "nextMonth", + nextMonth.toLocaleString(), + "Now", + now.toLocaleString(), + ); - // console.log(early, target); - // if we are to early return early only if we are sending over eom - if (data.type === "eom" && (early > now || target < now)) { - createLog( - "error", - "materials", - "ocp", - `Eom transfers is not allowed right now please try again at ${format( - nextMonth, - "M/d/yyyy hh:mm" - )} ` - ); - return { - success: false, - message: `Eom transfers is not allowed right now please try again at ${format( - nextMonth, - "M/d/yyyy hh:mm" - )} `, - data: [], - }; - } + // console.log(early, target); + // if we are to early return early only if we are sending over eom + if (data.type === "eom" && (early > now || target < now)) { + createLog( + "error", + "materials", + "ocp", + `Eom transfers is not allowed right now please try again at ${format( + nextMonth, + "M/d/yyyy hh:mm", + )} `, + ); + return { + success: false, + message: `Eom transfers is not allowed right now please try again at ${format( + nextMonth, + "M/d/yyyy hh:mm", + )} `, + data: [], + }; + } - let timeoutTrans: number = data.type === "lot" ? 30 : 10; - // get the barcode, and layoutID from the running number - const { data: label, error: labelError } = (await tryCatch( - query( - labelInfo.replace("[runningNr]", `${data.runningNumber}`), - "Get label info" - ) - )) as any; + let timeoutTrans: number = data.type === "lot" ? 30 : 10; + // get the barcode, and layoutID from the running number + const { data: label, error: labelError } = (await tryCatch( + query( + labelInfo.replace("[runningNr]", `${data.runningNumber}`), + "Get label info", + ), + )) as any; - if (labelError) { - createLog( - "error", - "materials", - "ocp", - "There was an error getting the label info" - ); - return { - success: false, - message: "There was an error getting the label info", - data: labelError, - }; - } + if (labelError) { + createLog( + "error", + "materials", + "ocp", + "There was an error getting the label info", + ); + return { + success: false, + message: "There was an error getting the label info", + data: labelError, + }; + } - if (label.data.length === 0) { - createLog( - "error", - "materials", - "ocp", - `${data.runningNumber}: dose not exist or no longer in stock.` - ); - return { - success: false, - message: `${data.runningNumber}: dose not exist or no longer in stock.`, - data: [], - }; - } + if (label.data.length === 0) { + createLog( + "error", + "materials", + "ocp", + `${data.runningNumber}: dose not exist or no longer in stock.`, + ); + return { + success: false, + message: `${data.runningNumber}: dose not exist or no longer in stock.`, + data: [], + }; + } - //console.log(label); + //console.log(label); - if (label.data[0]?.stockStatus === "onStock") { - createLog( - "error", - "materials", - "ocp", - `${data.runningNumber}: currently in stock and not consumed to a lot.` - ); - return { - success: false, - message: `${data.runningNumber}: currently in stock and not consumed to a lot.`, - data: [], - }; - } + if (label.data[0]?.stockStatus === "onStock") { + createLog( + "error", + "materials", + "ocp", + `${data.runningNumber}: currently in stock and not consumed to a lot.`, + ); + return { + success: false, + message: `${data.runningNumber}: currently in stock and not consumed to a lot.`, + data: [], + }; + } - // get the pdf24 printer id - const { data: printer, error: printerError } = (await tryCatch( - db.select().from(printerData).where(eq(printerData.name, "PDF24")) - )) as any; + // get the pdf24 printer id + const { data: printer, error: printerError } = (await tryCatch( + db.select().from(printerData).where(eq(printerData.name, "PDF24")), + )) as any; - if (printerError) { - createLog( - "error", - "materials", - "ocp", - "There was an error the printer info" - ); - return { - success: false, - message: "There was an error the printer info", - data: printerError, - }; - } - // calculate the remaining amount bascially it will be orignal number * level sent over - // level should be sent in a decimal .25 .5 .75 .95 the 95 will allow basically the what looks to be a full gaylord but we always want to consume something - const newQty = - data.amount > 0 - ? data.amount - : (data.originalAmount * data.level).toFixed(0); + if (printerError) { + createLog( + "error", + "materials", + "ocp", + "There was an error the printer info", + ); + return { + success: false, + message: "There was an error the printer info", + data: printerError, + }; + } + // calculate the remaining amount bascially it will be orignal number * level sent over + // level should be sent in a decimal .25 .5 .75 .95 the 95 will allow basically the what looks to be a full gaylord but we always want to consume something + const newQty = + data.amount > 0 + ? data.amount + : (data.originalAmount * data.level).toFixed(0); - //console.log(data.amount); + //console.log(data.amount); - // reprint the label and send it to pdf24 - const reprintData = { - clientId: 999, - runningNo: label?.data[0].runnungNumber, - printerId: printer[0].humanReadableId, - layoutId: label?.data[0].labelLayout, - noOfCopies: 0, - quantity: newQty, - } as any; + // reprint the label and send it to pdf24 + const reprintData = { + clientId: 999, + runningNo: label?.data[0].runnungNumber, + printerId: printer[0].humanReadableId, + layoutId: label?.data[0].labelLayout, + noOfCopies: 0, + quantity: newQty, + } as any; - //console.log(reprintData); + //console.log(reprintData); - const { data: reprint, error: reprintError } = (await tryCatch( - runProdApi({ - endpoint: "/public/v1.0/ProductionLabelling/ReprintLabel", - data: [reprintData], - }) - )) as any; + const { data: reprint, error: reprintError } = (await tryCatch( + runProdApi({ + endpoint: "/public/v1.0/ProductionLabelling/ReprintLabel", + data: [reprintData], + }), + )) as any; - if (!reprint.success) { - createLog( - "error", - "materials", - "ocp", - `RN:${data.runningNumber}, Reprinting Error: ${reprint.data.data.message}` - ); - return { - success: false, - message: `RN:${data.runningNumber}, Reprinting Error: ${reprint.data.data.message}`, - data: reprint, - }; - } - // return the label back to fm1 lane id 10001 + if (!reprint.success) { + createLog( + "error", + "materials", + "ocp", + `RN:${data.runningNumber}, Reprinting Error: ${reprint.data.data.message}`, + ); + return { + success: false, + message: `RN:${data.runningNumber}, Reprinting Error: ${reprint.data.data.message}`, + data: reprint, + }; + } + // return the label back to fm1 lane id 10001 - const matReturnData = { - barcode: label?.data[0].Barcode, - laneId: 10001, - }; + const matReturnData = { + barcode: label?.data[0].Barcode, + laneId: 10001, + }; - //console.log(matReturnData); - const { data: matReturn, error: matReturError } = (await tryCatch( - runProdApi({ - endpoint: - "/public/v1.0/IssueMaterial/ReturnPartiallyConsumedManualMaterial", - data: [matReturnData], - }) - )) as any; + //console.log(matReturnData); + const { data: matReturn, error: matReturError } = (await tryCatch( + runProdApi({ + endpoint: + "/public/v1.0/IssueMaterial/ReturnPartiallyConsumedManualMaterial", + data: [matReturnData], + }), + )) as any; - if (!matReturn.success) { - createLog( - "error", - "materials", - "ocp", - `RN:${data.runningNumber}, Return Error ${matReturn.data.data.errors[0].message}` - ); - return { - success: false, - message: `RN:${data.runningNumber}, Return Error ${matReturn.data.data.errors[0].message}`, - data: matReturn, - }; - } - // consume to the lot provided. - const consumeLot = { - productionLot: data.lotNumber, - barcode: label?.data[0].Barcode, - }; + if (!matReturn.success) { + createLog( + "error", + "materials", + "ocp", + `RN:${data.runningNumber}, Return Error ${matReturn.data.data.errors[0].message}`, + ); + return { + success: false, + message: `RN:${data.runningNumber}, Return Error ${matReturn.data.data.errors[0].message}`, + data: matReturn, + }; + } + // consume to the lot provided. + const consumeLot = { + productionLot: data.lotNumber, + barcode: label?.data[0].Barcode, + }; - const delay = - data.type === "lot" - ? timeoutTrans * 1000 - : target.getTime() - now.getTime(); + const delay = + data.type === "lot" + ? timeoutTrans * 1000 + : target.getTime() - now.getTime(); - const transfer = await transferMaterial(delay, data, consumeLot, newQty); + const transfer = await transferMaterial(delay, data, consumeLot, newQty); - if (!transfer.success) { - return { - success: transfer.success, - message: transfer.message, - data: transfer.data, - }; - } + if (!transfer.success) { + return { + success: transfer.success, + message: transfer.message, + data: transfer.data, + }; + } - const duration = intervalToDuration({ start: now, end: target }); - const pretty = formatDuration(duration, { - format: ["hours", "minutes", "seconds"], - }); + const duration = intervalToDuration({ start: now, end: target }); + const pretty = formatDuration(duration, { + format: ["hours", "minutes", "seconds"], + }); - if (data.type === "eom") { - return { - success: true, - message: `RN:${data.runningNumber}: qty: ${newQty}, will be transfered to lot: ${data.lotNumber}, in ${pretty} `, - data: [], - }; - } else { - return { - success: true, - message: `RN:${data.runningNumber}: qty: ${newQty}, was transfered to lot: ${data.lotNumber}`, - data: [], - }; - } + if (data.type === "eom") { + return { + success: true, + message: `RN:${data.runningNumber}: qty: ${newQty}, will be transfered to lot: ${data.lotNumber}, in ${pretty} `, + data: [], + }; + } else { + return { + success: true, + message: `RN:${data.runningNumber}: qty: ${newQty}, was transfered to lot: ${data.lotNumber}`, + data: [], + }; + } }; const transferMaterial = async ( - delay: number, - data: any, - consumeLot: any, - newQty: any + delay: number, + data: any, + consumeLot: any, + newQty: any, ) => { - //console.log(data); - if (pendingJobs.has(data.runningNumber)) { - createLog( - "error", - "materials", - "ocp", - `${data.runningNumber} is pending to be transfered already` - ); - return { - success: false, - message: `${data.runningNumber} is pending to be transfered already`, - data: [], - }; - } + //console.log(data); + if (pendingJobs.has(data.runningNumber)) { + createLog( + "error", + "materials", + "ocp", + `${data.runningNumber} is pending to be transfered already`, + ); + return { + success: false, + message: `${data.runningNumber} is pending to be transfered already`, + data: [], + }; + } - const scheduledFor = new Date(Date.now() + delay); - // sets the time out based on the type of transfer sent over. - const timeoutId = setTimeout(async () => { - try { - const { data: matConsume, error: matConsumeError } = - (await tryCatch( - runProdApi({ - endpoint: - "/public/v1.0/IssueMaterial/ConsumeNonPreparedManualMaterial", - data: [consumeLot], - }) - )) as any; + const scheduledFor = new Date(Date.now() + delay); + // sets the time out based on the type of transfer sent over. + const timeoutId = setTimeout(async () => { + try { + const { data: matConsume, error: matConsumeError } = (await tryCatch( + runProdApi({ + endpoint: + "/public/v1.0/IssueMaterial/ConsumeNonPreparedManualMaterial", + data: [consumeLot], + }), + )) as any; - if (!matConsume?.success) { - createLog( - "error", - "materials", - "ocp", - `RN:${data.runningNumber}, Consume Error ${ - matConsume?.data?.data?.errors?.[0]?.message ?? - "Unknown" - }` - ); - return; // still hits finally - } + if (!matConsume?.success) { + createLog( + "error", + "materials", + "ocp", + `RN:${data.runningNumber}, Consume Error ${ + matConsume?.data?.data?.errors?.[0]?.message ?? "Unknown" + }`, + ); + return; // still hits finally + } - createLog( - "info", - "materials", - "ocp", - `RN:${data.runningNumber}: qty: ${newQty}, was transferred to lot:${data.lotNumber}` - ); - } catch (err) { - createLog( - "error", - "materials", - "ocp", - `RN:${data.runningNumber}, ${err}` - ); - } finally { - // Always clear the pending entry, even if error - pendingJobs.delete(data.runningNumber); - } - }, delay); + createLog( + "info", + "materials", + "ocp", + `RN:${data.runningNumber}: qty: ${newQty}, was transferred to lot:${data.lotNumber}`, + ); + } catch (err) { + createLog( + "error", + "materials", + "ocp", + `RN:${data.runningNumber}, ${err}`, + ); + } finally { + // Always clear the pending entry, even if error + pendingJobs.delete(data.runningNumber); + } + }, delay); - pendingJobs.set(data.runningNumber, { - timeoutId, - runningNumber: data.runningNumber, - data, - consumeLot, - newQty, - scheduledFor, - }); + pendingJobs.set(data.runningNumber, { + timeoutId, + runningNumber: data.runningNumber, + data, + consumeLot, + newQty, + scheduledFor, + }); - // Immediately say we scheduled it - return { - success: true, - message: `Transfer for ${data.runningNumber} scheduled`, - data: [], - }; + // Immediately say we scheduled it + return { + success: true, + message: `Transfer for ${data.runningNumber} scheduled`, + data: [], + }; }; // setInterval(() => {