fix(dm): new scj custom mapping added for westbend
This commit is contained in:
@@ -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>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -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,
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user