migration #51

Merged
cowch merged 166 commits from migration into main 2025-09-19 22:18:47 -05:00
5 changed files with 437 additions and 175 deletions
Showing only changes of commit 0a6ddea8c0 - Show all commits

View File

@@ -1,19 +1,32 @@
import { LstCard } from "@/components/extendedUI/LstCard"; import { LstCard } from "@/components/extendedUI/LstCard";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { CardHeader } from "@/components/ui/card"; import { CardContent, CardHeader } from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Switch } from "@/components/ui/switch";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { useAppForm } from "@/utils/formStuff"; import { useAppForm } from "@/utils/formStuff";
import axios from "axios"; import axios from "axios";
import { useState } from "react"; import { useState } from "react";
import { toast } from "sonner"; import { toast } from "sonner";
import { Info } from "lucide-react";
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip";
export default function TransferToNextLot() { export default function TransferToNextLot() {
const [gaylordFilled, setGaylordFilled] = useState([0]); const [gaylordFilled, setGaylordFilled] = useState([0]);
const [actualAmount, setActualAmount] = useState(0);
const [tab, setTab] = useState("esitmate");
const [typeSwitch, setTypeSwitch] = useState(false);
const form = useAppForm({ const form = useAppForm({
defaultValues: { defaultValues: {
runnungNumber: "", runnungNumber: "",
lotNumber: "", lotNumber: "",
originalAmount: "", originalAmount: "",
amount: "",
}, },
onSubmit: async ({ value }) => { onSubmit: async ({ value }) => {
//console.log(transferData); //console.log(transferData);
@@ -32,11 +45,15 @@ export default function TransferToNextLot() {
? 0.75 ? 0.75
: gaylordFilled.length === 4 && 0.95 : gaylordFilled.length === 4 && 0.95
), ),
amount: actualAmount,
type: typeSwitch ? "eom" : "lot",
}); });
if (res.data.success) { if (res.data.success) {
toast.success(`${res.data.message}`); toast.success(`${res.data.message}`);
form.reset(); form.reset();
setGaylordFilled([0]);
setActualAmount(0);
} }
//console.log(res.data); //console.log(res.data);
@@ -64,73 +81,127 @@ export default function TransferToNextLot() {
<div className="flex gap-2"> <div className="flex gap-2">
<div> <div>
<LstCard className=""> <LstCard className="">
<div className="grid columns-1"> <Tabs
<button defaultValue={tab}
className={`box-border h-16 w-96 border-3 ${ onValueChange={setTab}
gaylordFilled.includes(4) >
? " bg-green-500" <TabsList>
: "" <TabsTrigger value="esitmate">
}`} Estimate Amount
onClick={() => </TabsTrigger>
setGaylordFilled([1, 2, 3, 4]) <TabsTrigger value="actual">
} Actual Amount
</TabsTrigger>
</TabsList>
<TabsContent value="esitmate">
<div className="grid columns-1">
<button
className={`box-border h-16 w-96 border-3 ${
gaylordFilled.includes(
4
)
? " bg-green-500"
: ""
}`}
onClick={() =>
setGaylordFilled([
1, 2, 3, 4,
])
}
>
<p className="text-center">
Almost full
</p>
</button>
<button
className={`box-border h-16 w-96 border-3 ${
gaylordFilled.includes(
3
)
? " bg-green-500"
: ""
}`}
onClick={() =>
setGaylordFilled([
1, 2, 3,
])
}
>
<p className="text-center">
About 75% full
</p>
</button>
<button
className={`box-border h-16 w-96 border-3 ${
gaylordFilled.includes(
2
)
? " bg-green-500"
: ""
}`}
onClick={() =>
setGaylordFilled([1, 2])
}
>
<p className="text-center">
Half full
</p>
</button>
<button
className={`box-border h-16 w-96 border-3 ${
gaylordFilled.includes(
1
)
? " bg-green-500"
: ""
}`}
onClick={() =>
setGaylordFilled(() => [
1,
])
}
>
<p className="text-center">
Almost empty
</p>
</button>
</div>
<div className="flex justify-end pr-1">
<Button
onClick={() =>
setGaylordFilled([0])
}
>
Reset Gaylord
</Button>
</div>
</TabsContent>
<TabsContent
value="actual"
className="w-96"
> >
<p className="text-center"> <CardHeader>
Almost full <p>
</p> Enter the total amount of
</button> the cage/gaylord
<button </p>
className={`box-border h-16 w-96 border-3 ${ </CardHeader>
gaylordFilled.includes(3) <CardContent>
? " bg-green-500" <Input
: "" type="number"
}`} //placeholder="35"
onClick={() => onChange={(e) =>
setGaylordFilled([1, 2, 3]) setActualAmount(
} Number(
> e.target.value
<p className="text-center"> )
About 75% full )
</p> }
</button> />
<button </CardContent>
className={`box-border h-16 w-96 border-3 ${ </TabsContent>
gaylordFilled.includes(2) </Tabs>
? " bg-green-500"
: ""
}`}
onClick={() =>
setGaylordFilled([1, 2])
}
>
<p className="text-center">
Half full
</p>
</button>
<button
className={`box-border h-16 w-96 border-3 ${
gaylordFilled.includes(1)
? " bg-green-500"
: ""
}`}
onClick={() =>
setGaylordFilled(() => [1])
}
>
<p className="text-center">
Almost empty
</p>
</button>
</div>
<div className="flex justify-end pr-1">
<Button
onClick={() =>
setGaylordFilled([0])
}
>
Reset Gaylord
</Button>
</div>
</LstCard> </LstCard>
</div> </div>
<div> <div>
@@ -165,20 +236,104 @@ export default function TransferToNextLot() {
/> />
)} )}
/> />
<div className="mt-3 p-2"> {tab !== "actual" && (
<form.AppField <div className="mt-3 p-2">
name="originalAmount" <form.AppField
children={(field) => ( name="originalAmount"
<field.InputField children={(
label="Orignal Quantity" field
inputType="number" ) => (
required={true} <field.InputField
/> label="Orignal Quantity"
)} inputType="number"
/> required={
</div> true
}
/>
)}
/>
</div>
)}
</div> </div>
<div className="flex justify-end p-2"> <div className="flex justify-between p-2">
<div className="flex items-center space-x-2">
<Switch
checked={typeSwitch}
onCheckedChange={
setTypeSwitch
}
/>
<span>
{typeSwitch ? (
<div className="flex items-center space-x-2">
<span>
"EOM
Transfer"
</span>
<Tooltip>
<TooltipTrigger>
<Info className="h-[16px] w-[16px]" />
</TooltipTrigger>
<TooltipContent>
<p>
Click
the
toggle
if
you
will
be
transfering
at
EOM,
NOTE:
This
will
trigger
the
delayed
transfer.
</p>
</TooltipContent>
</Tooltip>
</div>
) : (
<div className="flex items-center space-x-2">
<span>
"Lot
Transfer"
</span>
<Tooltip>
<TooltipTrigger>
<Info className="h-[16px] w-[16px]" />
</TooltipTrigger>
<TooltipContent>
<p>
Click
the
toggle
if
you
will
be
transfering
at
EOM,
NOTE:
This
will
trigger
the
delayed
transfer.
</p>
</TooltipContent>
</Tooltip>
</div>
)}
</span>
</div>
<form.AppForm> <form.AppForm>
<form.SubmitButton> <form.SubmitButton>
Transfer To Lot Transfer To Lot
@@ -197,49 +352,93 @@ export default function TransferToNextLot() {
Moving material to the next lot. Moving material to the next lot.
</p> </p>
</CardHeader> </CardHeader>
{tab !== "actual" ? (
<div>
<ol>
<li>
1. Grab the gaylord running
number from the gaylord at the
line/next to the tschritter
</li>
<li>
2. Grab the next lot number you
are going to be running (or the
one that state no Main material
prepared)
</li>
<li>
3. Enter the total gaylord
weight (this is how much the
gaylord weighed when it came in
from the supplier.)
</li>
<li>
4. *Click the level of the
gaylord (this is just an
estimate to move to the next
lot.)
</li>
<li>
5. type in running number on the
gaylord.
</li>
<li>
6. Type in the new lot number.
</li>
<li>7. Press "Transfer To Lot"</li>
</ol>
<br></br>
<p>
* to reduce the time needed to get
the lot going we will use an
estimate of how full the gaylord is.
</p>
<p>
NOTE: This is not the return
process, this process will just get
the gaylord to the next lot.
</p>
</div>
) : (
<div>
<ol>
<li>
1. Grab the gaylord running
number from the gaylord at the
line/next to the tschritter
</li>
<li>
2. Grab the next lot number you
are going to be running (or the
one that state no Main material
prepared)
</li>
<li>
3. Take the gaylord to the scale
and weight it
</li>
<li>
4. Enter the weight of the
gaylord minus the tar weight.
</li>
<li>
5. type in running number on the
gaylord.
</li>
<li>
6. Type in the new lot number.
</li>
<li>7. Press "Transfer To Lot"</li>
</ol>
<br></br>
<div> <p>
<ol> NOTE: This is not the return
<li> process, this process will just get
1. Grab the gaylord running number the gaylord to the next lot.
from the gaylord at the line/next to </p>
the tschritter </div>
</li> )}
<li>
2. Grab the next lot number you are
going to be running (or the one that
state no Main material prepared)
</li>
<li>
3. Enter the total gaylord weight
(this is how much the gaylord
weighed when it came in from the
supplier.)
</li>
<li>
4. *Click the level of the gaylord
(this is just an estimate to move to
the next lot.)
</li>
<li>
5. type in running number on the
gaylord.
</li>
<li>6. Type in the new lot number.</li>
<li>7. Press "Transfer To Lot"</li>
</ol>
<br></br>
<p>
* to reduce the time needed to get the
lot going we will use an estimate of how
full the gaylord is.
</p>
<p>
NOTE: This is not the return process,
this process will just get the gaylord
to the next lot.
</p>
</div>
</LstCard> </LstCard>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,29 @@
import * as React from "react"
import * as SwitchPrimitive from "@radix-ui/react-switch"
import { cn } from "@/lib/utils"
function Switch({
className,
...props
}: React.ComponentProps<typeof SwitchPrimitive.Root>) {
return (
<SwitchPrimitive.Root
data-slot="switch"
className={cn(
"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
className
)}
{...props}
>
<SwitchPrimitive.Thumb
data-slot="switch-thumb"
className={cn(
"bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0"
)}
/>
</SwitchPrimitive.Root>
)
}
export { Switch }

View File

@@ -17,6 +17,8 @@ export const consumeMaterial = async (data: Data, prod: any) => {
const { runningNr, lotNum } = data; const { runningNr, lotNum } = data;
// replace the rn // replace the rn
console.log(data);
const rnReplace = labelData.replaceAll("[rn]", runningNr); const rnReplace = labelData.replaceAll("[rn]", runningNr);
let barcode; let barcode;

View File

@@ -12,6 +12,8 @@ type NewLotData = {
lotNumber: number; lotNumber: number;
originalAmount: number; originalAmount: number;
level: number; level: number;
amount: number;
type: "lot" | "eom";
}; };
/** /**
@@ -22,8 +24,11 @@ type NewLotData = {
* Lot number * Lot number
* Orignal Quantity * Orignal Quantity
* level of gaylord * level of gaylord
* amount can be sent over as a precise amount
* type what way are we lots
*/ */
export const lotMaterialTransfer = async (data: NewLotData) => { export const lotMaterialTransfer = async (data: NewLotData) => {
let timeoutTrans: number = data.type === "lot" ? 1 : 10;
// get the barcode, and layoutID from the running number // get the barcode, and layoutID from the running number
const { data: label, error: labelError } = (await tryCatch( const { data: label, error: labelError } = (await tryCatch(
query( query(
@@ -46,22 +51,21 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
}; };
} }
// if ( if (label.data.length === 0) {
// label.data[0]?.stockStatus === "notOnStock" || createLog(
// label.data.length === 0 "error",
// ) { "materials",
// createLog( "ocp",
// "error", `${data.runnungNumber}: dose not exist or no longer in stock.`
// "materials", );
// "ocp", return {
// `${data.runnungNumber}: dose not exist or no longer in stock.` success: false,
// ); message: `${data.runnungNumber}: dose not exist or no longer in stock.`,
// return { data: [],
// success: false, };
// message: `${data.runnungNumber}: dose not exist or no longer in stock.`, }
// data: [],
// }; //console.log(label);
// }
if (label.data[0]?.stockStatus === "onStock") { if (label.data[0]?.stockStatus === "onStock") {
createLog( createLog(
@@ -97,7 +101,12 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
} }
// calculate the remaining amount bascially it will be orignal number * level sent over // 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 // 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.originalAmount * data.level).toFixed(0); const newQty =
data.amount > 0
? data.amount
: (data.originalAmount * data.level).toFixed(0);
//console.log(data.amount);
// reprint the label and send it to pdf24 // reprint the label and send it to pdf24
const reprintData = { const reprintData = {
@@ -109,6 +118,8 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
quantity: newQty, quantity: newQty,
} as any; } as any;
//console.log(reprintData);
const { data: reprint, error: reprintError } = (await tryCatch( const { data: reprint, error: reprintError } = (await tryCatch(
runProdApi({ runProdApi({
endpoint: "/public/v1.0/ProductionLabelling/ReprintLabel", endpoint: "/public/v1.0/ProductionLabelling/ReprintLabel",
@@ -121,11 +132,11 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
"error", "error",
"materials", "materials",
"ocp", "ocp",
`RN:${data.runnungNumber}, Error: ${reprint.data.data.message}` `RN:${data.runnungNumber}, Reprinting Error: ${reprint.data.data.message}`
); );
return { return {
success: false, success: false,
message: `RN:${data.runnungNumber}, Error: ${reprint.data.data.message}`, message: `RN:${data.runnungNumber}, Reprinting Error: ${reprint.data.data.message}`,
data: reprint, data: reprint,
}; };
} }
@@ -135,6 +146,8 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
barcode: label?.data[0].Barcode, barcode: label?.data[0].Barcode,
laneId: 10001, laneId: 10001,
}; };
//console.log(matReturnData);
const { data: matReturn, error: matReturError } = (await tryCatch( const { data: matReturn, error: matReturError } = (await tryCatch(
runProdApi({ runProdApi({
endpoint: endpoint:
@@ -148,11 +161,11 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
"error", "error",
"materials", "materials",
"ocp", "ocp",
`RN:${data.runnungNumber}, Error ${matReturn.data.data.errors[0].message}` `RN:${data.runnungNumber}, Return Error ${matReturn.data.data.errors[0].message}`
); );
return { return {
success: false, success: false,
message: `RN:${data.runnungNumber}, Error ${matReturn.data.data.errors[0].message}`, message: `RN:${data.runnungNumber}, Return Error ${matReturn.data.data.errors[0].message}`,
data: matReturn, data: matReturn,
}; };
} }
@@ -161,39 +174,56 @@ export const lotMaterialTransfer = async (data: NewLotData) => {
productionLot: data.lotNumber, productionLot: data.lotNumber,
barcode: label?.data[0].Barcode, barcode: label?.data[0].Barcode,
}; };
const { data: matConsume, error: matConsumeError } = (await tryCatch(
runProdApi({
endpoint:
"/public/v1.0/IssueMaterial/ConsumeNonPreparedManualMaterial",
data: [consumeLot],
})
)) as any;
if (!matConsume.success) { // sets the time out based on the type of transfer sent over.
createLog( setTimeout(
"error", async () => {
"materials", const { data: matConsume, error: matConsumeError } =
"ocp", (await tryCatch(
`RN:${data.runnungNumber}, Error ${matConsume.data.data.errors[0].message}` runProdApi({
); endpoint:
"/public/v1.0/IssueMaterial/ConsumeNonPreparedManualMaterial",
data: [consumeLot],
})
)) as any;
if (!matConsume.success) {
createLog(
"error",
"materials",
"ocp",
`RN:${data.runnungNumber}, Consume Error ${matConsume.data.data.errors[0].message}`
);
return {
success: false,
message: `RN:${data.runnungNumber}, Consume Error ${matConsume.data.data.errors[0].message}`,
data: matConsume,
};
}
createLog(
"info",
"materials",
"ocp",
`RN:${data.runnungNumber}: qty: ${newQty}, was transfered to lot:${data.lotNumber}`
);
},
data.type === "lot" ? timeoutTrans * 1000 : timeoutTrans * 1000 * 60
);
if (data.type === "eom") {
return { return {
success: false, success: true,
message: `RN:${data.runnungNumber}, Error ${matConsume.data.data.errors[0].message}`, message: `RN:${data.runnungNumber}: qty: ${newQty}, will be transfered to:${data.lotNumber}, in ${timeoutTrans}min`,
data: matConsume, data: [],
};
} else {
return {
success: true,
message: `RN:${data.runnungNumber}: qty: ${newQty}, was transfered to lot:${data.lotNumber}`,
data: [],
}; };
} }
createLog(
"info",
"materials",
"ocp",
`RN:${data.runnungNumber}: qty: ${newQty}, was transfered to lot:${data.lotNumber}`
);
return {
success: true,
message: `RN:${data.runnungNumber}: qty: ${newQty}, was transfered to lot:${data.lotNumber}`,
data: [],
};
}; };
// setTimeout(async () => { // setTimeout(async () => {

View File

@@ -54,10 +54,12 @@ app.openapi(
}); });
} }
console.log(transferMaterial);
return c.json({ return c.json({
success: transferMaterial.success, success: transferMaterial?.success,
message: transferMaterial.message, message: transferMaterial?.message,
data: transferMaterial.data, data: transferMaterial?.data,
}); });
} }
); );