Compare commits
3 Commits
7dbc31c046
...
2ebf695526
| Author | SHA1 | Date | |
|---|---|---|---|
| 2ebf695526 | |||
| 24af3ca403 | |||
| 6fbe3a9eed |
@@ -37,6 +37,7 @@ const lstDbRun = async (data: Data) => {
|
|||||||
if (data.options) {
|
if (data.options) {
|
||||||
if (data.name === "psiInventory") {
|
if (data.name === "psiInventory") {
|
||||||
const ids = data.options.articles.split(",").map((id: any) => id.trim());
|
const ids = data.options.articles.split(",").map((id: any) => id.trim());
|
||||||
|
|
||||||
const whse = data.options.whseToInclude
|
const whse = data.options.whseToInclude
|
||||||
? data.options.whseToInclude
|
? data.options.whseToInclude
|
||||||
.split(",")
|
.split(",")
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { Router } from "express";
|
import { Router } from "express";
|
||||||
|
import * as XLSX from "xlsx";
|
||||||
import { apiReturn } from "../utils/returnHelper.utils.js";
|
import { apiReturn } from "../utils/returnHelper.utils.js";
|
||||||
import { runDatamartQuery } from "./datamart.controller.js";
|
import { runDatamartQuery } from "./datamart.controller.js";
|
||||||
|
|
||||||
@@ -7,13 +8,73 @@ const r = Router();
|
|||||||
type Options = {
|
type Options = {
|
||||||
name: string;
|
name: string;
|
||||||
value: string;
|
value: string;
|
||||||
|
format: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
r.get("/:name", async (req, res) => {
|
r.get("/:name", async (req, res) => {
|
||||||
const { name } = req.params;
|
const { name } = req.params;
|
||||||
const options = req.query as Options;
|
const options = { ...req.query } as Options;
|
||||||
|
|
||||||
const dataRan = await runDatamartQuery({ name, options });
|
const dataRan = await runDatamartQuery({ name, options });
|
||||||
|
|
||||||
|
if (!dataRan.success) {
|
||||||
|
return apiReturn(res, {
|
||||||
|
success: false,
|
||||||
|
level: "error",
|
||||||
|
module: "datamart",
|
||||||
|
subModule: "query",
|
||||||
|
message: dataRan.message,
|
||||||
|
status: 500,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// XLSX Export
|
||||||
|
if (options.format?.toLowerCase() === "xlsx") {
|
||||||
|
const wb = XLSX.utils.book_new();
|
||||||
|
|
||||||
|
const ws = XLSX.utils.json_to_sheet(dataRan.data);
|
||||||
|
|
||||||
|
XLSX.utils.book_append_sheet(wb, ws, name);
|
||||||
|
|
||||||
|
const buffer = XLSX.write(wb, {
|
||||||
|
type: "buffer",
|
||||||
|
bookType: "xlsx",
|
||||||
|
});
|
||||||
|
|
||||||
|
res.setHeader(
|
||||||
|
"Content-Type",
|
||||||
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||||
|
);
|
||||||
|
|
||||||
|
res.setHeader("Content-Disposition", `attachment; filename="${name}.xlsx"`);
|
||||||
|
|
||||||
|
return res.send(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// CSV Export
|
||||||
|
if (options.format?.toLowerCase() === "csv") {
|
||||||
|
const rows = dataRan.data as any;
|
||||||
|
|
||||||
|
if (!rows.length) {
|
||||||
|
return res.status(200).send("");
|
||||||
|
}
|
||||||
|
|
||||||
|
const headers = Object.keys(rows[0]);
|
||||||
|
|
||||||
|
const csv = [
|
||||||
|
headers.join(","),
|
||||||
|
...rows.map((row: any) =>
|
||||||
|
headers
|
||||||
|
.map((h) => `"${String(row[h] ?? "").replace(/"/g, '""')}"`)
|
||||||
|
.join(","),
|
||||||
|
),
|
||||||
|
].join("\r\n");
|
||||||
|
|
||||||
|
res.setHeader("Content-Type", "text/csv");
|
||||||
|
res.setHeader("Content-Disposition", `attachment; filename="${name}.csv"`);
|
||||||
|
|
||||||
|
return res.send(csv);
|
||||||
|
}
|
||||||
|
|
||||||
return apiReturn(res, {
|
return apiReturn(res, {
|
||||||
success: dataRan.success,
|
success: dataRan.success,
|
||||||
level: "info",
|
level: "info",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import {
|
|||||||
sqlQuerySelector,
|
sqlQuerySelector,
|
||||||
} from "../prodSql/prodSqlQuerySelector.utils.js";
|
} from "../prodSql/prodSqlQuerySelector.utils.js";
|
||||||
import { returnFunc } from "../utils/returnHelper.utils.js";
|
import { returnFunc } from "../utils/returnHelper.utils.js";
|
||||||
import { sendEmail } from "../utils/sendEmail.utils.js";
|
//import { sendEmail } from "../utils/sendEmail.utils.js";
|
||||||
import { tryCatch } from "../utils/trycatch.utils.js";
|
import { tryCatch } from "../utils/trycatch.utils.js";
|
||||||
import { postData } from "./logistics.dm.postData.js";
|
import { postData } from "./logistics.dm.postData.js";
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ export const lorealForecast = async (data: any, user: any) => {
|
|||||||
|
|
||||||
const article: any = a?.data;
|
const article: any = a?.data;
|
||||||
|
|
||||||
console.log(article);
|
//console.log(article);
|
||||||
|
|
||||||
// process the ebm forcast
|
// process the ebm forcast
|
||||||
for (let i = 0; i < ebmForeCastData.length; i++) {
|
for (let i = 0; i < ebmForeCastData.length; i++) {
|
||||||
@@ -127,31 +127,6 @@ export const lorealForecast = async (data: any, user: any) => {
|
|||||||
//console.log(ebmForeCastData.length);
|
//console.log(ebmForeCastData.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
// petForeCastData.forEach((item: any, index: any) => {
|
|
||||||
// //console.log(`Processing item ${index + 1} of ${forecastData.length}`);
|
|
||||||
|
|
||||||
// // Extract the customer code
|
|
||||||
// const customerCode = item["SOUTH PET BOTTLES"];
|
|
||||||
|
|
||||||
// // Process each date in the current object
|
|
||||||
// for (const [date, qty] of Object.entries(item)) {
|
|
||||||
// // Skip metadata fields
|
|
||||||
// if (petMetadataFields.includes(date)) continue;
|
|
||||||
|
|
||||||
// if (qty === 0) continue;
|
|
||||||
|
|
||||||
// // Create your transformed record
|
|
||||||
// const record = {
|
|
||||||
// customerArticleNo: customerCode,
|
|
||||||
// requirementDate: excelDateStuff(parseInt(date)),
|
|
||||||
// quantity: qty,
|
|
||||||
// };
|
|
||||||
|
|
||||||
// // Do something with this record
|
|
||||||
// petForecastData.push(record);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
|
|
||||||
// pet forecast
|
// pet forecast
|
||||||
for (let i = 0; i < petForeCastData.length; i++) {
|
for (let i = 0; i < petForeCastData.length; i++) {
|
||||||
// bottle code
|
// bottle code
|
||||||
@@ -200,25 +175,25 @@ export const lorealForecast = async (data: any, user: any) => {
|
|||||||
//console.log(comForecast);
|
//console.log(comForecast);
|
||||||
|
|
||||||
// email the for the missing ones
|
// email the for the missing ones
|
||||||
const missedGrouped = Object.values(
|
// const missedGrouped = Object.values(
|
||||||
missingSku.reduce((acc: any, item: any) => {
|
// missingSku.reduce((acc: any, item: any) => {
|
||||||
const key = item.customerArticleNo;
|
// const key = item.customerArticleNo;
|
||||||
|
|
||||||
if (!acc[key]) {
|
// if (!acc[key]) {
|
||||||
// first time we see this customer
|
// // first time we see this customer
|
||||||
acc[key] = item;
|
// acc[key] = item;
|
||||||
} else {
|
// } else {
|
||||||
// compare dates and keep the earliest
|
// // compare dates and keep the earliest
|
||||||
if (
|
// if (
|
||||||
new Date(item.requirementDate) < new Date(acc[key].requirementDate)
|
// new Date(item.requirementDate) < new Date(acc[key].requirementDate)
|
||||||
) {
|
// ) {
|
||||||
acc[key] = item;
|
// acc[key] = item;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
return acc;
|
// return acc;
|
||||||
}, {}),
|
// }, {}),
|
||||||
);
|
// );
|
||||||
|
|
||||||
// TODO: change this to a flagged notification so that he users can subscribe or leave it. this removes the hardcody shit.
|
// TODO: change this to a flagged notification so that he users can subscribe or leave it. this removes the hardcody shit.
|
||||||
// const emailSetup = {
|
// const emailSetup = {
|
||||||
@@ -248,19 +223,7 @@ export const lorealForecast = async (data: any, user: any) => {
|
|||||||
|
|
||||||
const updatedPredefinedObject = {
|
const updatedPredefinedObject = {
|
||||||
...predefinedObject,
|
...predefinedObject,
|
||||||
positions: [
|
positions: [...predefinedObject.positions, ...ebmForecastData],
|
||||||
...predefinedObject.positions,
|
|
||||||
...ebmForecastData,
|
|
||||||
|
|
||||||
// ...ebmForecastData.filter(
|
|
||||||
// (q: any) =>
|
|
||||||
// q.customerArticleNo != "" && q.customerArticleNo != "Total"
|
|
||||||
// ),
|
|
||||||
// ...petForecastData.filter(
|
|
||||||
// (q: any) =>
|
|
||||||
// q.customerArticleNo != "" && q.customerArticleNo != "Total"
|
|
||||||
// ),
|
|
||||||
],
|
|
||||||
};
|
};
|
||||||
// console.log(updatedPredefinedObject);
|
// console.log(updatedPredefinedObject);
|
||||||
|
|
||||||
|
|||||||
@@ -113,8 +113,8 @@ export const pNgForecast = async (data: any, user: any) => {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
return {
|
return {
|
||||||
customerArticleNo: parseInt(o["Customer Item No."]),
|
customerArticleNo: parseInt(o["Customer Item No."] ?? "0", 10),
|
||||||
requirementDate: excelDateStuff(parseInt(o["Request Date"])),
|
requirementDate: excelDateStuff(parseInt(o["Request Date"] ?? "0", 10)),
|
||||||
quantity: o["Remaining Qty to be Shipped"],
|
quantity: o["Remaining Qty to be Shipped"],
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -19,13 +19,13 @@ import { setupUtilsRoutes } from "./utils/utils.routes.js";
|
|||||||
|
|
||||||
export const setupRoutes = (baseUrl: string, app: Express) => {
|
export const setupRoutes = (baseUrl: string, app: Express) => {
|
||||||
//routes that are on by default
|
//routes that are on by default
|
||||||
|
setupDatamartRoutes(baseUrl, app);
|
||||||
setupMobileRoutes(baseUrl, app);
|
setupMobileRoutes(baseUrl, app);
|
||||||
setupSystemRoutes(baseUrl, app);
|
setupSystemRoutes(baseUrl, app);
|
||||||
setupAdminRoutes(baseUrl, app);
|
setupAdminRoutes(baseUrl, app);
|
||||||
setupApiDocsRoutes(baseUrl, app);
|
setupApiDocsRoutes(baseUrl, app);
|
||||||
setupProdSqlRoutes(baseUrl, app);
|
setupProdSqlRoutes(baseUrl, app);
|
||||||
setupGPSqlRoutes(baseUrl, app);
|
setupGPSqlRoutes(baseUrl, app);
|
||||||
setupDatamartRoutes(baseUrl, app);
|
|
||||||
setupAuthRoutes(baseUrl, app);
|
setupAuthRoutes(baseUrl, app);
|
||||||
setupUtilsRoutes(baseUrl, app);
|
setupUtilsRoutes(baseUrl, app);
|
||||||
setupOpendockRoutes(baseUrl, app);
|
setupOpendockRoutes(baseUrl, app);
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"target": "ESNext",
|
|
||||||
"module": "NodeNext",
|
|
||||||
"moduleResolution": "nodenext",
|
|
||||||
"strict": true,
|
|
||||||
"verbatimModuleSyntax": true,
|
|
||||||
"types": ["node", "better-auth"],
|
|
||||||
"jsx": "react-jsx",
|
|
||||||
"outDir": "./dist",
|
|
||||||
"removeComments": true,
|
|
||||||
"allowJs": false,
|
|
||||||
"rootDir": "./backend",
|
|
||||||
"noUnusedLocals": true,
|
|
||||||
"noUnusedParameters": true,
|
|
||||||
"noFallthroughCasesInSwitch": true,
|
|
||||||
"noUncheckedIndexedAccess": true,
|
|
||||||
"exactOptionalPropertyTypes": true,
|
|
||||||
"baseUrl": ".",
|
|
||||||
"paths": {
|
|
||||||
"@/*": ["backend/*"],
|
|
||||||
"@features/*": ["backend/features/*"],
|
|
||||||
"@shared/*": ["backend/shared/*"],
|
|
||||||
"@config/*": ["backend/config/*"]
|
|
||||||
},
|
|
||||||
"esModuleInterop": true,
|
|
||||||
"skipLibCheck": true,
|
|
||||||
"forceConsistentCasingInFileNames": true,
|
|
||||||
"resolveJsonModule": true,
|
|
||||||
//"allowImportingTsExtensions": true,
|
|
||||||
"noEmit": false
|
|
||||||
},
|
|
||||||
"include": ["backend/**/*"],
|
|
||||||
"exclude": [
|
|
||||||
"node_modules",
|
|
||||||
"frontend",
|
|
||||||
"dist",
|
|
||||||
"lstDocs",
|
|
||||||
"database/testFiles",
|
|
||||||
"scripts"
|
|
||||||
]}
|
|
||||||
Reference in New Issue
Block a user