fix(dm): new scj custom mapping added for westbend

This commit is contained in:
2025-12-12 10:53:33 -06:00
parent 501709546d
commit 8e3d2b3d95
3 changed files with 276 additions and 113 deletions

View File

@@ -3,72 +3,60 @@ import ForecastImport from "./ForecastImport";
import OrderImport from "./OrderImport"; import OrderImport from "./OrderImport";
export default function DMButtons() { export default function DMButtons() {
const { settings } = useSettingStore(); const { settings } = useSettingStore();
const testServers = ["test1", "test2", "test3"]; const testServers = ["test1", "test2", "test3"];
const plantToken = settings.filter((n) => n.name === "plantToken"); const plantToken = settings.filter((n) => n.name === "plantToken");
//console.log(plantToken); //console.log(plantToken);
return ( return (
<div className="flex flex-row-reverse gap-1"> <div className="flex flex-row-reverse gap-1">
<OrderImport fileType={"macro"} name={"Macro Import"} /> <OrderImport fileType={"macro"} name={"Macro Import"} />
{/* dev and testserver sees all */} {/* dev and testserver sees all */}
{testServers.includes(plantToken[0]?.value) && ( {testServers.includes(plantToken[0]?.value) && (
<div className="flex flex-row gap-2"> <div className="flex flex-row gap-2">
<OrderImport <OrderImport fileType={"abbott"} name={"Abbott truck list"} />
fileType={"abbott"} <OrderImport fileType={"energizer"} name={"Energizer Truck List"} />
name={"Abbott truck list"} <OrderImport fileType={"scj"} name={"SCJ Orders"} />
/> <ForecastImport fileType={"loreal"} name={"VMI Import"} />
<OrderImport <ForecastImport fileType={"pg"} name={"P&G"} />
fileType={"energizer"} <ForecastImport fileType={"energizer"} name={"Energizer Forecast"} />
name={"Energizer Truck List"} </div>
/> )}
<ForecastImport fileType={"loreal"} name={"VMI Import"} /> {plantToken[0]?.value === "usday1" && (
<ForecastImport fileType={"pg"} name={"P&G"} /> <div className="flex flex-row gap-2">
<ForecastImport <OrderImport fileType={"abbott"} name={"Abbott truck list"} />
fileType={"energizer"} <OrderImport fileType={"energizer"} name={"Energizer Truck List"} />
name={"Energizer Forecast"} <ForecastImport fileType={"energizer"} name={"Energizer Forecast"} />
/> </div>
</div> )}
)} {plantToken[0]?.value === "usflo1" && (
{plantToken[0]?.value === "usday1" && ( <div className="flex flex-row gap-2">
<div className="flex flex-row gap-2"> <ForecastImport fileType={"loreal"} name={"VMI Import"} />
<OrderImport </div>
fileType={"abbott"} )}
name={"Abbott truck list"} {plantToken[0]?.value === "usstp1" && (
/> <div className="flex flex-row gap-2"></div>
<OrderImport )}
fileType={"energizer"} {plantToken[0]?.value === "usiow1" && (
name={"Energizer Truck List"} <div className="flex flex-row gap-2">
/> <ForecastImport fileType={"pg"} name={"P&G"} />
<ForecastImport </div>
fileType={"energizer"} )}
name={"Energizer Forecast"} {plantToken[0]?.value === "usiow2" && (
/> <div className="flex flex-row gap-2">
</div> <ForecastImport fileType={"pg"} name={"P&G"} />
)} </div>
{plantToken[0]?.value === "usflo1" && ( )}
<div className="flex flex-row gap-2"> {plantToken[0]?.value === "usksc1" && (
<ForecastImport fileType={"loreal"} name={"VMI Import"} /> <div className="flex flex-row gap-2">
</div> <ForecastImport fileType={"pg"} name={"P&G"} />
)} </div>
{plantToken[0]?.value === "usstp1" && ( )}
<div className="flex flex-row gap-2"></div> {plantToken[0]?.value === "usweb1" && (
)} <div className="flex flex-row gap-2">
{plantToken[0]?.value === "usiow1" && ( <OrderImport fileType={"scj"} name={"SCJ Orders"} />
<div className="flex flex-row gap-2"> </div>
<ForecastImport fileType={"pg"} name={"P&G"} /> )}
</div> </div>
)} );
{plantToken[0]?.value === "usiow2" && (
<div className="flex flex-row gap-2">
<ForecastImport fileType={"pg"} name={"P&G"} />
</div>
)}
{plantToken[0]?.value === "usksc1" && (
<div className="flex flex-row gap-2">
<ForecastImport fileType={"pg"} name={"P&G"} />
</div>
)}
</div>
);
} }

View File

@@ -0,0 +1,166 @@
import XLSX from "xlsx";
import { db } from "../../../../../../../database/dbclient.js";
import { settings } from "../../../../../../../database/schema/settings.js";
import { tryCatch } from "../../../../../../globalUtils/tryCatch.js";
import { query } from "../../../../../sqlServer/prodSqlServer.js";
import { invoiceAddress } from "../../../../../sqlServer/querys/dm/invoiceAddress.js";
import { orderState } from "../../../../../sqlServer/querys/dm/orderState.js";
import { excelDateStuff } from "../../../../utils/excelDateStuff.js";
import { postOrders } from "../postOrders.js";
export const scjOrders = async (data: any, user: any) => {
/**
* Standard orders meaning that we get the standard file exported and fill it out and uplaod to lst.
*/
const customerID = 48;
const { data: s, error: e } = await tryCatch(db.select().from(settings));
if (e) {
return {
sucess: false,
message: `Error getting settings`,
data: e,
};
}
// order state
const { data: o, error: oe } = await tryCatch(
query(orderState, "Gets the next 500 orders that have not been started"),
);
const openOrders: any = o?.data;
if (oe) {
return {
sucess: false,
message: `Error getting article data`,
data: oe,
};
}
// order state
const { data: invoice, error: ie } = await tryCatch(
query(invoiceAddress, "Gets invoices addresses"),
);
const i: any = invoice?.data;
if (ie) {
return {
sucess: false,
message: `Error getting invoice address data`,
data: ie,
};
}
const plantToken = s.filter((s) => s.name === "plantToken");
const arrayBuffer = await data.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
const workbook = XLSX.read(buffer, { type: "buffer" });
const sheetName: any = workbook.Sheets["Sheet1"];
const sheet = XLSX.utils.decode_range(sheetName["!ref"]);
// define custom headers
const headers = [
"ItemNo",
"Description",
"DeliveryDate",
"Quantity",
"PO",
"Releases",
"remarks",
];
const orderData = XLSX.utils.sheet_to_json(sheetName, {
defval: "",
header: headers,
range: 1,
});
// the base of the import
const predefinedObject = {
receivingPlantId: plantToken[0].value,
documentName: `OrdersFromLST-${new Date(Date.now()).toLocaleString(
"en-US",
)}`,
sender: user.username || "lst-system",
externalRefNo: `OrdersFromLST-${new Date(Date.now()).toLocaleString(
"en-US",
)}`,
orders: [],
};
let newOrders: any = orderData;
// filter out the orders that have already been started just to reduce the risk of errors.
newOrders.filter((oo: any) =>
openOrders.some(
(o: any) => o.CustomerOrderNumber === oo.CustomerOrderNumber,
),
);
// filter out the blanks
newOrders = newOrders.filter((z: any) => z.ItemNo !== "");
const nOrder = newOrders.map((o: any) => {
const invoice = i.filter((i: any) => i.deliveryAddress === customerID);
if (!invoice) {
return;
}
if (o.Releases === "") {
return;
}
if (o.PO === "") {
return;
}
const date = isNaN(o.DeliveryDate)
? new Date(o.DeliveryDate)
: excelDateStuff(o.DeliveryDate);
return {
customerId: customerID,
invoiceAddressId: invoice[0].invoiceAddress, // matched to the default invoice address
customerOrderNo: o.PO,
orderDate: new Date(Date.now()).toLocaleString("en-US"),
positions: [
{
deliveryAddressId: customerID,
customerArticleNo: o.ItemNo,
quantity: parseInt(o.Quantity),
deliveryDate: date, //excelDateStuff(o.DELDATE),
customerLineItemNo: o.PO, // this is how it is currently sent over from abbott
customerReleaseNo: o.Releases, // same as above
remark: o.remarks === "" ? null : o.remarks,
},
],
};
});
//console.log(nOrder.filter((o: any) => o !== undefined));
// // do that fun combining thing
const updatedPredefinedObject = {
...predefinedObject,
orders: [
...predefinedObject.orders,
...nOrder.filter((o: any) => o !== undefined),
],
};
//console.log(updatedPredefinedObject.orders[0]);
// // post the orders to the server
const posting: any = await postOrders(updatedPredefinedObject, user);
return {
customer: customerID,
//totalOrders: orders?.length(),
success: posting.success,
message: posting.message,
data: posting.data,
};
};

View File

@@ -1,61 +1,70 @@
import { abbottOrders } from "./mappings/abbottTruckList.js"; import { abbottOrders } from "./mappings/abbottTruckList.js";
import { energizerOrders } from "./mappings/energizerOrdersIn.js"; import { energizerOrders } from "./mappings/energizerOrdersIn.js";
import { macroImportOrders } from "./mappings/macroImport.js"; import { macroImportOrders } from "./mappings/macroImport.js";
import { scjOrders } from "./mappings/scj.js";
import { standardOrders } from "./mappings/standardOrders.js"; import { standardOrders } from "./mappings/standardOrders.js";
export const ordersIn = async (data: any, user: any) => { export const ordersIn = async (data: any, user: any) => {
/** /**
* Bulk orders in, and custom file parsing. * Bulk orders in, and custom file parsing.
*/ */
let success = true; let success = true;
let message = ""; let message = "";
let orderData: any = []; let orderData: any = [];
// what type of order are we dealing with? // what type of order are we dealing with?
if (data["fileType"] === "standard") { if (data["fileType"] === "standard") {
// run the standard orders in // run the standard orders in
const standard = await standardOrders(data["postOrders"], user); const standard = await standardOrders(data["postOrders"], user);
success = standard.success ?? false; success = standard.success ?? false;
message = standard.message ?? "Error posting Standard Orders"; message = standard.message ?? "Error posting Standard Orders";
orderData = standard.data; orderData = standard.data;
} }
if (data["fileType"] === "abbott") { if (data["fileType"] === "abbott") {
// orders in // orders in
const abbott = await abbottOrders(data["postOrders"], user); const abbott = await abbottOrders(data["postOrders"], user);
success = abbott.success ?? false; success = abbott.success ?? false;
message = abbott.message ?? "Error posting Abbott Orders"; message = abbott.message ?? "Error posting Abbott Orders";
orderData = abbott.data; orderData = abbott.data;
} }
if (data["fileType"] === "energizer") { if (data["fileType"] === "energizer") {
// orders in // orders in
const energizer = await energizerOrders(data["postOrders"], user); const energizer = await energizerOrders(data["postOrders"], user);
success = energizer.success ?? false; success = energizer.success ?? false;
message = energizer.message ?? "Error posting Energizer Orders"; message = energizer.message ?? "Error posting Energizer Orders";
orderData = energizer.data; orderData = energizer.data;
} }
if (data["fileType"] === "loreal") { if (data["fileType"] === "loreal") {
// orders in // orders in
} }
if (data["fileType"] === "pg") { if (data["fileType"] === "pg") {
// orders in // orders in
} }
if (data["fileType"] === "macro") { if (data["fileType"] === "macro") {
// orders in // orders in
const macro = await macroImportOrders(data["postOrders"], user); const macro = await macroImportOrders(data["postOrders"], user);
success = macro.success ?? false; success = macro.success ?? false;
message = macro.message ?? "Error posting Macro Orders"; message = macro.message ?? "Error posting Macro Orders";
orderData = macro.data; orderData = macro.data;
} }
return { if (data["fileType"] === "scj") {
success, // orders in
message, const macro = await scjOrders(data["postOrders"], user);
data: orderData, success = macro.success ?? false;
}; message = macro.message ?? "Error posting Macro Orders";
orderData = macro.data;
}
return {
success,
message,
data: orderData,
};
}; };