diff --git a/frontend/src/components/logistics/dm/DMButtons.tsx b/frontend/src/components/logistics/dm/DMButtons.tsx index 9cfda08..0678a70 100644 --- a/frontend/src/components/logistics/dm/DMButtons.tsx +++ b/frontend/src/components/logistics/dm/DMButtons.tsx @@ -8,6 +8,7 @@ export default function DMButtons() { //console.log(plantToken); return (
+ {/* dev and testserver sees all */} {testServers.includes(plantToken[0]?.value) && (
diff --git a/server/services/dataMart/controller/fakeEDIUpdate.ts b/server/services/dataMart/controller/fakeEDIUpdate.ts new file mode 100644 index 0000000..bd65d5f --- /dev/null +++ b/server/services/dataMart/controller/fakeEDIUpdate.ts @@ -0,0 +1,39 @@ +import { createLog } from "../../logger/logger.js"; +import { query } from "../../sqlServer/prodSqlServer.js"; +import { fakeEDIUpdate } from "../../sqlServer/querys/dataMart/fakeEDIUpdate.js"; + +export const getFakeEDI = async (address: string) => { + let fakeEDI: any = []; + + let updatedQuery = fakeEDIUpdate; + + if (address) { + createLog( + "info", + "datamart", + "datamart", + "The user requested a specific address." + ); + updatedQuery = fakeEDIUpdate.replace( + "--and IdAdresse = 14", + `and IdAdresse = ${address}` + ); + } + + try { + fakeEDI = await query(updatedQuery, "Gets fakeEDI orders to be fixed"); + + return { + success: true, + message: "Current open orders", + data: fakeEDI.data, + }; + } catch (error) { + console.log(error); + return { + success: false, + message: "There was an error open orders", + data: error, + }; + } +}; diff --git a/server/services/dataMart/dataMartService.ts b/server/services/dataMart/dataMartService.ts index 7262d0e..684d411 100644 --- a/server/services/dataMart/dataMartService.ts +++ b/server/services/dataMart/dataMartService.ts @@ -5,6 +5,7 @@ import currentInv from "./route/getInventory.js"; import getCustomerInv from "./route/getCustomerInv.js"; import getOpenOrders from "./route/getOpenOrders.js"; import getDeliveryByDate from "./route/getDeliveryDateByRange.js"; +import fakeEDI from "./route/fakeEDI.js"; const app = new OpenAPIHono(); @@ -15,6 +16,7 @@ const routes = [ getCustomerInv, getOpenOrders, getDeliveryByDate, + fakeEDI, ] as const; const appRoutes = routes.forEach((route) => { diff --git a/server/services/dataMart/route/fakeEDI.ts b/server/services/dataMart/route/fakeEDI.ts new file mode 100644 index 0000000..1b22510 --- /dev/null +++ b/server/services/dataMart/route/fakeEDI.ts @@ -0,0 +1,53 @@ +import { createRoute, OpenAPIHono, z } from "@hono/zod-openapi"; +import { responses } from "../../../globalUtils/routeDefs/responses.js"; +import { tryCatch } from "../../../globalUtils/tryCatch.js"; +import { getINV } from "../controller/getinventory.js"; +import { getFakeEDI } from "../controller/fakeEDIUpdate.js"; + +const app = new OpenAPIHono({ strict: false }); +const Body = z.object({ + address: z.string().openapi({ example: "x" }), +}); +app.openapi( + createRoute({ + tags: ["dataMart"], + summary: "Returns all open orders that need to be updated in fake edi.", + method: "get", + path: "/fakeediupdate", + request: { + body: { + content: { + "application/json": { schema: Body }, + }, + }, + }, + responses: responses(), + }), + async (c) => { + const address: string = c.req.query("address") ?? ""; + + // make sure we have a vaid user being accessed thats really logged in + //apiHit(c, { endpoint: `api/logger/logs/id` }); + const { data, error } = await tryCatch( + getFakeEDI(address.toString() ?? "") + ); + + if (error) { + return c.json( + { + success: false, + message: "There was an error getting the inv.", + data: error, + }, + 400 + ); + } + + return c.json({ + success: data.success, + message: data.message, + data: data.data, + }); + } +); +export default app; diff --git a/server/services/logistics/controller/dm/ordersIn/mappings/macroImport.ts b/server/services/logistics/controller/dm/ordersIn/mappings/macroImport.ts new file mode 100644 index 0000000..913c3f4 --- /dev/null +++ b/server/services/logistics/controller/dm/ordersIn/mappings/macroImport.ts @@ -0,0 +1,195 @@ +import { delay } from "../../../../../../globalUtils/delay.js"; +import XLSX from "xlsx"; +import { tryCatch } from "../../../../../../globalUtils/tryCatch.js"; +import { db } from "../../../../../../../database/dbclient.js"; +import { settings } from "../../../../../../../database/schema/settings.js"; +import { query } from "../../../../../sqlServer/prodSqlServer.js"; +import { orderState } from "../../../../../sqlServer/querys/dm/orderState.js"; +import { excelDateStuff } from "../../../../utils/excelDateStuff.js"; +import { invoiceAddress } from "../../../../../sqlServer/querys/dm/invoiceAddress.js"; +import { postOrders } from "../postOrders.js"; + +export const macroImportOrders = async (data: any, user: any) => { + /** + * Standard orders meaning that we get the standard file exported and fill it out and uplaod to lst. + */ + + 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 = workbook.SheetNames[0]; + const sheet = workbook.Sheets["Data"]; + + // define custom headers + const headers = [ + "CustomerArticleNumber", + "CustomerOrderNumber", + "CustomerLineNumber", + "CustomerRealeaseNumber", + "Quantity", + "DeliveryDate", + "CustomerID", + "Remark", + ]; + const orderData = XLSX.utils.sheet_to_json(sheet, { + defval: "", + header: headers, + range: 5, + }); + + // 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: [], + }; + + const removeBlanks = orderData.filter( + (n: any) => n.CustomerArticleNumber != "" + ); + + console.log(removeBlanks); + const groupedByCustomer: any = removeBlanks.reduce( + (acc: any, item: any) => { + const id = item.CustomerID; + if (!acc[id]) { + acc[id] = []; + } + acc[id].push(item); + return acc; + }, + {} + ); + + let postedOrders: any = []; + for (const [customerID, orders] of Object.entries(groupedByCustomer)) { + // console.log(`Running for Customer ID: ${customerID}`); + const filterOrders: any = orders; + const newOrders: any = []; + //newOrders.filter((oo) => openOrders.some((o) => String(o.CustomerOrderNumber) === String(oo.CustomerOrderNumber))); + //console.log(newOrders) + filterOrders.forEach((oo: any) => { + const isMatch = openOrders.some( + (o: any) => + String(o.CustomerOrderNumber).trim() === + String(oo.CustomerOrderNumber).trim() + ); + if (!isMatch) { + console.log(`ok to update: ${oo.CustomerOrderNumber}`); + + newOrders.push(oo); + } else { + console.log( + `Not valid order to update: ${oo.CustomerOrderNumber}` + ); + //console.log(oo) + } + }); + + // 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 + ) + ); + + // map everything out for each order + const nOrder = newOrders.map((o: any) => { + const invoice = i.filter( + (i: any) => i.deliveryAddress === parseInt(customerID) + ); + if (!invoice) { + return; + } + return { + customerId: parseInt(customerID), + invoiceAddressId: invoice[0]?.invoiceAddress, // matched to the default invoice address + customerOrderNo: o.CustomerOrderNumber, + orderDate: new Date(Date.now()).toLocaleString("en-US"), + positions: [ + { + deliveryAddressId: parseInt(customerID), + customerArticleNo: o.CustomerArticleNumber, + quantity: parseInt(o.Quantity), + deliveryDate: excelDateStuff(o.DeliveryDate), + customerLineItemNo: o.CustomerLineNumber, // this is how it is currently sent over from abbott + customerReleaseNo: o.CustomerRealeaseNumber, // same as above + }, + ], + }; + }); + + // do that fun combining thing + const updatedPredefinedObject = { + ...predefinedObject, + orders: [...predefinedObject.orders, ...nOrder], + }; + + //console.log(updatedPredefinedObject); + + // post the orders to the server + const posting: any = await postOrders(updatedPredefinedObject, user); + + postedOrders.push({ + customer: customerID, + //totalOrders: orders?.length(), + success: posting.success, + message: posting.message, + data: posting.data, + }); + } + + return { + success: true, + message: + "Standard Template was just processed successfully, please check AlplaProd 2.0 to confirm no errors. ", + data: postedOrders, + }; +}; diff --git a/server/services/sqlServer/querys/dataMart/fakeEDIUpdate.ts b/server/services/sqlServer/querys/dataMart/fakeEDIUpdate.ts new file mode 100644 index 0000000..ddd8d5a --- /dev/null +++ b/server/services/sqlServer/querys/dataMart/fakeEDIUpdate.ts @@ -0,0 +1,17 @@ +export const fakeEDIUpdate = ` +Select LEFT(ArtikelVariantenAlias, charindex(' ', ArtikelVariantenAlias) - 1) CustomerArticleNumber, +AuftragsNummer AS CustomerOrderNumber, +PositionsNummer as CustomerLineNumber, +AbrufNummer AS CustomerRealeaseNumber, +AbrufMenge AS Quantity, +' ' AS DeliveryDate, +IdAdresse AS CustomerID, +' ' AS Remark +--,* +FROM AlplaPROD_test1.dbo.V_TrackerAuftragsAbrufe +WHERE AbrufStatus = 1 +--AND AbrufLiefertermin > DATEADD(d, -1, getdate()) +AND GelieferteMenge = 0 +--and IdAdresse = 14 +ORDER BY AbrufLiefertermin +`;