161 lines
4.6 KiB
TypeScript
161 lines
4.6 KiB
TypeScript
import axios from "axios";
|
|
import { type DrizzleError, sql } from "drizzle-orm";
|
|
import type { Request, Response } from "express";
|
|
import { Router } from "express";
|
|
import https from "https";
|
|
import type z from "zod";
|
|
import { db } from "../../../../pkg/db/db.js";
|
|
import {
|
|
leaseInvoiceForklifts,
|
|
newForkliftInvoiceSchema,
|
|
} from "../../../../pkg/db/schema/forkliftLeasesInvoice.js";
|
|
import {
|
|
leaseInvoices,
|
|
newInvoiceSchema,
|
|
} from "../../../../pkg/db/schema/leaseInvoices.js";
|
|
import { createLogger } from "../../../../pkg/logger/logger.js";
|
|
import { tryCatch } from "../../../../pkg/utils/tryCatch.js";
|
|
|
|
const router = Router();
|
|
|
|
router.post("/", async (req: Request, res: Response) => {
|
|
// when a new server is posted from localhost or 127.0.0.1 we also want to post it to the test server so we can see it from there
|
|
//res.status(200).json({ message: "Server added", ip: req.hostname });
|
|
const log = createLogger({ module: "forklift", subModule: "add invoice" });
|
|
|
|
const parsedInvoice = newInvoiceSchema.safeParse({
|
|
leaseId: req.body.leaseId,
|
|
companyId: req.body.companyId,
|
|
invoiceNumber: req.body.invoiceNumber,
|
|
invoiceDate: req.body.invoiceDate,
|
|
uploadedBy: req.body.uploadedBy,
|
|
totalAmount: req.body.totalAmount,
|
|
});
|
|
|
|
if (!parsedInvoice.success)
|
|
return res.status(400).json({ error: parsedInvoice.error.flatten });
|
|
|
|
const invoiceData = parsedInvoice.data;
|
|
|
|
const forkliftItems = Array.isArray(req.body.forklifts)
|
|
? req.body.forklifts
|
|
: [];
|
|
|
|
const validatedForklifts = []; //z.infer<typeof newForkliftInvoiceSchema>[] = [];
|
|
|
|
for (const item of forkliftItems) {
|
|
// const parsedItem = newForkliftInvoiceSchema.safeParse(item);
|
|
// if (parsedItem.success) {
|
|
validatedForklifts.push(item);
|
|
//} else {
|
|
//return res.status(400).json({ error: parsedItem.error.flatten() });
|
|
//}
|
|
}
|
|
|
|
// this will be the total invoice amount minus each forklift this way we can keep the total amount in here plus forklifts seperated
|
|
const totalAmount = (
|
|
validatedForklifts.reduce((sum, f) => sum + Number(f.amount || 0), 0) -
|
|
req.body.totalInvoice
|
|
).toString();
|
|
|
|
const { data, error } = await tryCatch(
|
|
db
|
|
.insert(leaseInvoices)
|
|
.values({
|
|
...invoiceData,
|
|
uploadedBy: req.user!.username || "lst_user",
|
|
})
|
|
.onConflictDoUpdate({
|
|
target: leaseInvoices.invoiceNumber,
|
|
set: {
|
|
totalAmount,
|
|
invoiceDate: invoiceData.invoiceDate,
|
|
uploadedBy: req.user!.username || "lst_user",
|
|
},
|
|
})
|
|
.returning(),
|
|
);
|
|
|
|
if (error) {
|
|
const err: DrizzleError = error;
|
|
return res.status(400).json({
|
|
message: `Error adding lease`,
|
|
error: err.cause,
|
|
});
|
|
}
|
|
|
|
const invoiceId = data[0]?.id;
|
|
|
|
const forkliftInvoices = validatedForklifts.map((f) => ({
|
|
invoiceId,
|
|
forkliftId: f.forklift_Id,
|
|
amount: f.amount,
|
|
}));
|
|
console.log(forkliftInvoices);
|
|
if (validatedForklifts.length > 0) {
|
|
await db.insert(leaseInvoiceForklifts).values(forkliftInvoices);
|
|
// .onConflictDoUpdate({
|
|
// target: [
|
|
// leaseInvoiceForklifts.invoiceId,
|
|
// leaseInvoiceForklifts.forkliftId,
|
|
// ],
|
|
// set: { amount: (excluded) => excluded.amount },
|
|
// });
|
|
}
|
|
// if (req.hostname === "localhost" && process.env.MAIN_SERVER) {
|
|
// log.info({}, "Running in dev server about to add in a new server");
|
|
// const axiosInstance = axios.create({
|
|
// httpsAgent: new https.Agent({ rejectUnauthorized: false }),
|
|
// baseURL: process.env.MAIN_SERVER, // e.g. "https://example.com"
|
|
// withCredentials: true,
|
|
// });
|
|
|
|
// const loginRes = (await axiosInstance.post(
|
|
// `${process.env.MAIN_SERVER}/lst/api/auth/sign-in/username`,
|
|
// {
|
|
// username: process.env.MAIN_SERVER_USERNAME,
|
|
// password: process.env.MAIN_SERVER_PASSWORD,
|
|
// },
|
|
// {
|
|
// headers: { "Content-Type": "application/json" },
|
|
// },
|
|
// )) as any;
|
|
// const setCookie = loginRes.headers["set-cookie"][0];
|
|
|
|
// if (!setCookie) {
|
|
// throw new Error("Did not receive a Set-Cookie header from login");
|
|
// }
|
|
|
|
// const { data, error } = await tryCatch(
|
|
// axios.post(
|
|
// `${process.env.MAIN_SERVER}/lst/api/forklifts/leases`,
|
|
// parsed.data,
|
|
// {
|
|
// headers: {
|
|
// "Content-Type": "application/json",
|
|
// Cookie: setCookie.split(";")[0],
|
|
// },
|
|
// withCredentials: true,
|
|
// },
|
|
// ),
|
|
// );
|
|
|
|
// if (error) {
|
|
// log.error(
|
|
// { stack: error },
|
|
// "There was an error adding the company to Main Server",
|
|
// );
|
|
// }
|
|
// log.info(
|
|
// { stack: data?.data },
|
|
// "A new Company was just added to the server.",
|
|
// );
|
|
// }
|
|
|
|
return res
|
|
.status(201)
|
|
.json({ message: `lease ${data[0]?.invoiceNumber} added`, data: data });
|
|
});
|
|
|
|
export default router;
|