- Finish cleanup

Signed-off-by: Dave Richer <dave@imexsystems.ca>
This commit is contained in:
Dave Richer
2024-01-23 00:02:18 -05:00
parent a162b275a3
commit 52f8eabd2b
22 changed files with 1033 additions and 1045 deletions

View File

@@ -18,10 +18,10 @@ const {
} = require("./qbo-callback"); } = require("./qbo-callback");
const OAuthClient = require("intuit-oauth"); const OAuthClient = require("intuit-oauth");
const moment = require("moment-timezone"); const moment = require("moment-timezone");
const GraphQLClient = require("graphql-request").GraphQLClient;
const findTaxCode = require("../qb-receivables-lines").findTaxCode; const findTaxCode = require("../qb-receivables-lines").findTaxCode;
exports.default = async (req, res) => { exports.default = async (req, res) => {
const oauthClient = new OAuthClient({ const oauthClient = new OAuthClient({
clientId: process.env.QBO_CLIENT_ID, clientId: process.env.QBO_CLIENT_ID,
clientSecret: process.env.QBO_SECRET, clientSecret: process.env.QBO_SECRET,
@@ -30,29 +30,31 @@ exports.default = async (req, res) => {
redirectUri: process.env.QBO_REDIRECT_URI, redirectUri: process.env.QBO_REDIRECT_URI,
logging: true, logging: true,
}); });
try { try {
//Fetch the API Access Tokens & Set them for the session. //Fetch the API Access Tokens & Set them for the session.
const response = await apiGqlClient.request(queries.GET_QBO_AUTH, { const response = await apiGqlClient.request(queries.GET_QBO_AUTH, {
email: req.user.email, email: req.user.email,
}); });
const { qbo_realmId } = response.associations[0]; const { qbo_realmId } = response.associations[0];
oauthClient.setToken(response.associations[0].qbo_auth); oauthClient.setToken(response.associations[0].qbo_auth);
if (!qbo_realmId) { if (!qbo_realmId) {
res.status(401).json({ error: "No company associated." }); res.status(401).json({ error: "No company associated." });
return; return;
} }
await refreshOauthToken(oauthClient, req); await refreshOauthToken(oauthClient, req);
const BearerToken = req.headers.authorization;
const { bills: billsToQuery, elgen } = req.body; const { bills: billsToQuery, elgen } = req.body;
//Query Job Info
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { const BearerToken = req.BearerToken;
headers: { const client = req.userGraphQLClient;
Authorization: BearerToken,
},
});
logger.log("qbo-payable-create", "DEBUG", req.user.email, billsToQuery); logger.log("qbo-payable-create", "DEBUG", req.user.email, billsToQuery);
const result = await client const result = await client
.setHeaders({ Authorization: BearerToken }) .setHeaders({ Authorization: BearerToken })
.request(queries.QUERY_BILLS_FOR_PAYABLES_EXPORT, { .request(queries.QUERY_BILLS_FOR_PAYABLES_EXPORT, {

View File

@@ -51,15 +51,13 @@ exports.default = async (req, res) => {
} }
await refreshOauthToken(oauthClient, req); await refreshOauthToken(oauthClient, req);
const BearerToken = req.headers.authorization;
const { payments: paymentsToQuery, elgen } = req.body; const { payments: paymentsToQuery, elgen } = req.body;
//Query Job Info
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { const BearerToken = req.BearerToken;
headers: { const client = req.userGraphQLClient;
Authorization: BearerToken,
},
});
logger.log("qbo-payment-create", "DEBUG", req.user.email, paymentsToQuery); logger.log("qbo-payment-create", "DEBUG", req.user.email, paymentsToQuery);
const result = await client const result = await client
.setHeaders({ Authorization: BearerToken }) .setHeaders({ Authorization: BearerToken })
.request(queries.QUERY_PAYMENTS_FOR_EXPORT, { .request(queries.QUERY_PAYMENTS_FOR_EXPORT, {

View File

@@ -18,8 +18,6 @@ const {
const OAuthClient = require("intuit-oauth"); const OAuthClient = require("intuit-oauth");
const CreateInvoiceLines = require("../qb-receivables-lines").default; const CreateInvoiceLines = require("../qb-receivables-lines").default;
const moment = require("moment-timezone"); const moment = require("moment-timezone");
const GraphQLClient = require("graphql-request").GraphQLClient;
const { generateOwnerTier } = require("../qbxml/qbxml-utils"); const { generateOwnerTier } = require("../qbxml/qbxml-utils");
const { createMultiQbPayerLines } = require("../qb-receivables-lines"); const { createMultiQbPayerLines } = require("../qb-receivables-lines");
@@ -46,15 +44,14 @@ exports.default = async (req, res) => {
await refreshOauthToken(oauthClient, req); await refreshOauthToken(oauthClient, req);
const BearerToken = req.headers.authorization;
const { jobIds, elgen } = req.body; const { jobIds, elgen } = req.body;
//Query Job Info //Query Job Info
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {
headers: { const BearerToken = req.BearerToken;
Authorization: BearerToken, const client = req.userGraphQLClient;
},
});
logger.log("qbo-receivable-create", "DEBUG", req.user.email, jobIds); logger.log("qbo-receivable-create", "DEBUG", req.user.email, jobIds);
const result = await client const result = await client
.setHeaders({ Authorization: BearerToken }) .setHeaders({ Authorization: BearerToken })
.request(queries.QUERY_JOBS_FOR_RECEIVABLES_EXPORT, { .request(queries.QUERY_JOBS_FOR_RECEIVABLES_EXPORT, {

View File

@@ -3,10 +3,11 @@ const path = require("path");
const DineroQbFormat = require("../accounting-constants").DineroQbFormat; const DineroQbFormat = require("../accounting-constants").DineroQbFormat;
const queries = require("../../graphql-client/queries"); const queries = require("../../graphql-client/queries");
const Dinero = require("dinero.js"); const Dinero = require("dinero.js");
var builder = require("xmlbuilder2"); const builder = require("xmlbuilder2");
const QbXmlUtils = require("./qbxml-utils"); const QbXmlUtils = require("./qbxml-utils");
const moment = require("moment-timezone"); const moment = require("moment-timezone");
const logger = require("../../utils/logger"); const logger = require('../../utils/logger');
require("dotenv").config({ require("dotenv").config({
path: path.resolve( path: path.resolve(
process.cwd(), process.cwd(),
@@ -15,14 +16,10 @@ require("dotenv").config({
}); });
exports.default = async (req, res) => { exports.default = async (req, res) => {
const BearerToken = req.headers.authorization;
const { bills: billsToQuery } = req.body; const { bills: billsToQuery } = req.body;
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { const BearerToken = req.BearerToken;
headers: { const client = req.userGraphQLClient;
Authorization: BearerToken,
},
});
try { try {
logger.log( logger.log(

View File

@@ -1,13 +1,12 @@
const GraphQLClient = require("graphql-request").GraphQLClient;
const path = require("path"); const path = require("path");
const DineroQbFormat = require("../accounting-constants").DineroQbFormat; const DineroQbFormat = require("../accounting-constants").DineroQbFormat;
const queries = require("../../graphql-client/queries"); const queries = require("../../graphql-client/queries");
const Dinero = require("dinero.js"); const Dinero = require("dinero.js");
var builder = require("xmlbuilder2"); const builder = require("xmlbuilder2");
const moment = require("moment-timezone"); const moment = require("moment-timezone");
const QbXmlUtils = require("./qbxml-utils"); const QbXmlUtils = require("./qbxml-utils");
const QbxmlReceivables = require("./qbxml-receivables"); const QbxmlReceivables = require("./qbxml-receivables");
const logger = require("../../utils/logger"); const logger = require('../../utils/logger');
require("dotenv").config({ require("dotenv").config({
path: path.resolve( path: path.resolve(
@@ -19,14 +18,10 @@ require("dotenv").config({
const { generateJobTier, generateOwnerTier, generateSourceTier } = QbXmlUtils; const { generateJobTier, generateOwnerTier, generateSourceTier } = QbXmlUtils;
exports.default = async (req, res) => { exports.default = async (req, res) => {
const BearerToken = req.headers.authorization;
const { payments: paymentsToQuery } = req.body; const { payments: paymentsToQuery } = req.body;
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { const BearerToken = req.BearerToken;
headers: { const client = req.userGraphQLClient;
Authorization: BearerToken,
},
});
try { try {
logger.log( logger.log(

View File

@@ -1,13 +1,12 @@
const GraphQLClient = require("graphql-request").GraphQLClient;
const path = require("path"); const path = require("path");
const DineroQbFormat = require("../accounting-constants").DineroQbFormat; const DineroQbFormat = require("../accounting-constants").DineroQbFormat;
const queries = require("../../graphql-client/queries"); const queries = require("../../graphql-client/queries");
const Dinero = require("dinero.js"); const Dinero = require("dinero.js");
const moment = require("moment-timezone"); const moment = require("moment-timezone");
var builder = require("xmlbuilder2"); const builder = require("xmlbuilder2");
const QbXmlUtils = require("./qbxml-utils"); const QbXmlUtils = require("./qbxml-utils");
const logger = require("../../utils/logger");
const CreateInvoiceLines = require("../qb-receivables-lines").default; const CreateInvoiceLines = require("../qb-receivables-lines").default;
const logger = require('../../utils/logger');
require("dotenv").config({ require("dotenv").config({
path: path.resolve( path: path.resolve(
@@ -20,14 +19,10 @@ Dinero.globalRoundingMode = "HALF_EVEN";
const { generateJobTier, generateOwnerTier, generateSourceTier } = QbXmlUtils; const { generateJobTier, generateOwnerTier, generateSourceTier } = QbXmlUtils;
exports.default = async (req, res) => { exports.default = async (req, res) => {
const BearerToken = req.headers.authorization;
const { jobIds } = req.body; const { jobIds } = req.body;
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { const BearerToken = req.BearerToken;
headers: { const client = req.userGraphQLClient;
Authorization: BearerToken,
},
});
try { try {
logger.log( logger.log(

View File

@@ -5,7 +5,6 @@ require("dotenv").config({
`.env.${process.env.NODE_ENV || "development"}` `.env.${process.env.NODE_ENV || "development"}`
), ),
}); });
const GraphQLClient = require("graphql-request").GraphQLClient;
const soap = require("soap"); const soap = require("soap");
const queries = require("../graphql-client/queries"); const queries = require("../graphql-client/queries");
@@ -34,16 +33,11 @@ const { CDK_CREDENTIALS, CheckCdkResponseForError } = require("./cdk-wsdl");
exports.default = async function ReloadCdkMakes(req, res) { exports.default = async function ReloadCdkMakes(req, res) {
const { bodyshopid, cdk_dealerid } = req.body; const { bodyshopid, cdk_dealerid } = req.body;
try { try {
const BearerToken = req.headers.authorization;
//Query all CDK Models //Query all CDK Models
const newList = await GetCdkMakes(req, cdk_dealerid); const newList = await GetCdkMakes(req, cdk_dealerid);
//Clear out the existing records const BearerToken = req.BearerToken;
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { const client = req.userGraphQLClient;
headers: {
Authorization: BearerToken,
},
});
const deleteResult = await client const deleteResult = await client
.setHeaders({ Authorization: BearerToken }) .setHeaders({ Authorization: BearerToken })

View File

@@ -1,29 +1,24 @@
const _ = require("lodash");
const Dinero = require("dinero.js"); const Dinero = require("dinero.js");
const queries = require("../graphql-client/queries"); const queries = require("../graphql-client/queries");
//const client = require("../graphql-client/graphql-client").client; const logger = require('../utils/logger');
const _ = require("lodash"); const {DiscountNotAlreadyCounted} = require("./job-totals");
const GraphQLClient = require("graphql-request").GraphQLClient;
const logger = require("../utils/logger");
const { DiscountNotAlreadyCounted } = require("./job-totals");
// Dinero.defaultCurrency = "USD"; // Dinero.defaultCurrency = "USD";
// Dinero.globalLocale = "en-CA"; // Dinero.globalLocale = "en-CA";
Dinero.globalRoundingMode = "HALF_EVEN"; Dinero.globalRoundingMode = "HALF_EVEN";
async function JobCosting(req, res) { async function JobCosting(req, res) {
const { jobid } = req.body; const {jobid} = req.body;
const BearerToken = req.headers.authorization; const BearerToken = req.BearerToken;
const client = req.userGraphQLClient;
logger.log("job-costing-start", "DEBUG", req.user.email, jobid, null); logger.log("job-costing-start", "DEBUG", req.user.email, jobid, null);
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {
headers: {
Authorization: BearerToken,
},
});
try { try {
const resp = await client const resp = await client
.setHeaders({ Authorization: BearerToken }) .setHeaders({Authorization: BearerToken})
.request(queries.QUERY_JOB_COSTING_DETAILS, { .request(queries.QUERY_JOB_COSTING_DETAILS, {
id: jobid, id: jobid,
}); });
@@ -42,19 +37,18 @@ async function JobCosting(req, res) {
} }
async function JobCostingMulti(req, res) { async function JobCostingMulti(req, res) {
const { jobids } = req.body; const {jobids} = req.body;
const BearerToken = req.headers.authorization;
const logger = req.logger;
const BearerToken = req.BearerToken
const client = req.userGraphQLClient;
logger.log("job-costing-multi-start", "DEBUG", req.user.email, jobids, null); logger.log("job-costing-multi-start", "DEBUG", req.user.email, jobids, null);
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {
headers: {
Authorization: BearerToken,
},
});
try { try {
const resp = await client const resp = await client
.setHeaders({ Authorization: BearerToken }) .setHeaders({Authorization: BearerToken})
.request(queries.QUERY_JOB_COSTING_DETAILS_MULTI, { .request(queries.QUERY_JOB_COSTING_DETAILS_MULTI, {
ids: jobids, ids: jobids,
}); });
@@ -62,23 +56,23 @@ async function JobCostingMulti(req, res) {
const multiSummary = { const multiSummary = {
costCenterData: [], costCenterData: [],
summaryData: { summaryData: {
totalLaborSales: Dinero({ amount: 0 }), totalLaborSales: Dinero({amount: 0}),
totalPartsSales: Dinero({ amount: 0 }), totalPartsSales: Dinero({amount: 0}),
totalAdditionalSales: Dinero({ amount: 0 }), totalAdditionalSales: Dinero({amount: 0}),
totalSubletSales: Dinero({ amount: 0 }), totalSubletSales: Dinero({amount: 0}),
totalSales: Dinero({ amount: 0 }), totalSales: Dinero({amount: 0}),
totalLaborCost: Dinero({ amount: 0 }), totalLaborCost: Dinero({amount: 0}),
totalPartsCost: Dinero({ amount: 0 }), totalPartsCost: Dinero({amount: 0}),
totalAdditionalCost: Dinero({ amount: 0 }), totalAdditionalCost: Dinero({amount: 0}),
totalSubletCost: Dinero({ amount: 0 }), totalSubletCost: Dinero({amount: 0}),
totalCost: Dinero({ amount: 0 }), totalCost: Dinero({amount: 0}),
gpdollars: Dinero({ amount: 0 }), gpdollars: Dinero({amount: 0}),
gppercent: null, gppercent: null,
gppercentFormatted: null, gppercentFormatted: null,
totalLaborGp: Dinero({ amount: 0 }), totalLaborGp: Dinero({amount: 0}),
totalPartsGp: Dinero({ amount: 0 }), totalPartsGp: Dinero({amount: 0}),
totalAdditionalGp: Dinero({ amount: 0 }), totalAdditionalGp: Dinero({amount: 0}),
totalSubletGp: Dinero({ amount: 0 }), totalSubletGp: Dinero({amount: 0}),
totalLaborGppercent: null, totalLaborGppercent: null,
totalLaborGppercentFormatted: null, totalLaborGppercentFormatted: null,
totalPartsGppercent: null, totalPartsGppercent: null,
@@ -314,7 +308,7 @@ function GenerateCostingData(job) {
["Unknown"] ["Unknown"]
); );
const materialsHours = { mapaHrs: 0, mashHrs: 0 }; const materialsHours = {mapaHrs: 0, mashHrs: 0};
let hasMapaLine = false; let hasMapaLine = false;
let hasMashLine = false; let hasMashLine = false;
@@ -398,7 +392,7 @@ function GenerateCostingData(job) {
(val.prt_dsmk_p && val.prt_dsmk_p !== 0)) && (val.prt_dsmk_p && val.prt_dsmk_p !== 0)) &&
DiscountNotAlreadyCounted(val, job.joblines) DiscountNotAlreadyCounted(val, job.joblines)
? val.prt_dsmk_m ? val.prt_dsmk_m
? Dinero({ amount: Math.round(val.prt_dsmk_m * 100) }) ? Dinero({amount: Math.round(val.prt_dsmk_m * 100)})
: Dinero({ : Dinero({
amount: Math.round(val.act_price * 100), amount: Math.round(val.act_price * 100),
}) })
@@ -438,7 +432,7 @@ function GenerateCostingData(job) {
(val.prt_dsmk_p && val.prt_dsmk_p !== 0)) && (val.prt_dsmk_p && val.prt_dsmk_p !== 0)) &&
DiscountNotAlreadyCounted(val, job.joblines) DiscountNotAlreadyCounted(val, job.joblines)
? val.prt_dsmk_m ? val.prt_dsmk_m
? Dinero({ amount: Math.round(val.prt_dsmk_m * 100) }) ? Dinero({amount: Math.round(val.prt_dsmk_m * 100)})
: Dinero({ : Dinero({
amount: Math.round(val.act_price * 100), amount: Math.round(val.act_price * 100),
}) })
@@ -474,7 +468,7 @@ function GenerateCostingData(job) {
(val.prt_dsmk_p && val.prt_dsmk_p !== 0)) && (val.prt_dsmk_p && val.prt_dsmk_p !== 0)) &&
DiscountNotAlreadyCounted(val, job.joblines) DiscountNotAlreadyCounted(val, job.joblines)
? val.prt_dsmk_m ? val.prt_dsmk_m
? Dinero({ amount: Math.round(val.prt_dsmk_m * 100) }) ? Dinero({amount: Math.round(val.prt_dsmk_m * 100)})
: Dinero({ : Dinero({
amount: Math.round(val.act_price * 100), amount: Math.round(val.act_price * 100),
}) })
@@ -492,7 +486,7 @@ function GenerateCostingData(job) {
return acc; return acc;
}, },
{ parts: {}, labor: {}, additional: {}, sublet: {} } {parts: {}, labor: {}, additional: {}, sublet: {}}
); );
if (!hasMapaLine) { if (!hasMapaLine) {
@@ -608,7 +602,7 @@ function GenerateCostingData(job) {
}); });
return bill_acc; return bill_acc;
}, },
{ additionalCosts: {}, subletCosts: {} } {additionalCosts: {}, subletCosts: {}}
); );
//If the hourly rates for job costing are set, add them in. //If the hourly rates for job costing are set, add them in.
@@ -738,21 +732,21 @@ function GenerateCostingData(job) {
); );
const summaryData = { const summaryData = {
totalLaborSales: Dinero({ amount: 0 }), totalLaborSales: Dinero({amount: 0}),
totalPartsSales: Dinero({ amount: 0 }), totalPartsSales: Dinero({amount: 0}),
totalAdditionalSales: Dinero({ amount: 0 }), totalAdditionalSales: Dinero({amount: 0}),
totalSubletSales: Dinero({ amount: 0 }), totalSubletSales: Dinero({amount: 0}),
totalSales: Dinero({ amount: 0 }), totalSales: Dinero({amount: 0}),
totalLaborCost: Dinero({ amount: 0 }), totalLaborCost: Dinero({amount: 0}),
totalPartsCost: Dinero({ amount: 0 }), totalPartsCost: Dinero({amount: 0}),
totalAdditionalCost: Dinero({ amount: 0 }), totalAdditionalCost: Dinero({amount: 0}),
totalSubletCost: Dinero({ amount: 0 }), totalSubletCost: Dinero({amount: 0}),
totalCost: Dinero({ amount: 0 }), totalCost: Dinero({amount: 0}),
totalLaborGp: Dinero({ amount: 0 }), totalLaborGp: Dinero({amount: 0}),
totalPartsGp: Dinero({ amount: 0 }), totalPartsGp: Dinero({amount: 0}),
totalAdditionalGp: Dinero({ amount: 0 }), totalAdditionalGp: Dinero({amount: 0}),
totalSubletGp: Dinero({ amount: 0 }), totalSubletGp: Dinero({amount: 0}),
gpdollars: Dinero({ amount: 0 }), gpdollars: Dinero({amount: 0}),
totalLaborGppercent: null, totalLaborGppercent: null,
totalLaborGppercentFormatted: null, totalLaborGppercentFormatted: null,
totalPartsGppercent: null, totalPartsGppercent: null,
@@ -768,20 +762,20 @@ function GenerateCostingData(job) {
const costCenterData = allCenters.map((key, idx) => { const costCenterData = allCenters.map((key, idx) => {
const ccVal = key; // defaultProfits[key]; const ccVal = key; // defaultProfits[key];
const sale_labor = const sale_labor =
jobLineTotalsByProfitCenter.labor[ccVal] || Dinero({ amount: 0 }); jobLineTotalsByProfitCenter.labor[ccVal] || Dinero({amount: 0});
const sale_parts = const sale_parts =
jobLineTotalsByProfitCenter.parts[ccVal] || Dinero({ amount: 0 }); jobLineTotalsByProfitCenter.parts[ccVal] || Dinero({amount: 0});
const sale_additional = const sale_additional =
jobLineTotalsByProfitCenter.additional[ccVal] || Dinero({ amount: 0 }); jobLineTotalsByProfitCenter.additional[ccVal] || Dinero({amount: 0});
const sale_sublet = const sale_sublet =
jobLineTotalsByProfitCenter.sublet[ccVal] || Dinero({ amount: 0 }); jobLineTotalsByProfitCenter.sublet[ccVal] || Dinero({amount: 0});
const cost_labor = ticketTotalsByCostCenter[ccVal] || Dinero({ amount: 0 }); const cost_labor = ticketTotalsByCostCenter[ccVal] || Dinero({amount: 0});
const cost_parts = billTotalsByCostCenters[ccVal] || Dinero({ amount: 0 }); const cost_parts = billTotalsByCostCenters[ccVal] || Dinero({amount: 0});
const cost_additional = const cost_additional =
billTotalsByCostCenters.additionalCosts[ccVal] || Dinero({ amount: 0 }); billTotalsByCostCenters.additionalCosts[ccVal] || Dinero({amount: 0});
const cost_sublet = const cost_sublet =
billTotalsByCostCenters.subletCosts[ccVal] || Dinero({ amount: 0 }); billTotalsByCostCenters.subletCosts[ccVal] || Dinero({amount: 0});
const costs = cost_labor const costs = cost_labor
.add(cost_parts) .add(cost_parts)
@@ -943,7 +937,7 @@ function GenerateCostingData(job) {
summaryData.gppercentFormatted = `${summaryData.gppercent}%`; summaryData.gppercentFormatted = `${summaryData.gppercent}%`;
} }
return { summaryData, costCenterData }; return {summaryData, costCenterData};
} }
exports.JobCosting = JobCosting; exports.JobCosting = JobCosting;

View File

@@ -1,6 +1,7 @@
const _ = require("lodash"); const _ = require("lodash");
const jobLifecycle = (req, res) => { const jobLifecycle = (req, res) => {
const {jobids} = req.body; const {jobids} = req.body;
return _.isArray(jobids) ? return _.isArray(jobids) ?
handleMultipleJobs(jobids, req, res) : handleMultipleJobs(jobids, req, res) :
handleSingleJob(jobids, req, res); handleSingleJob(jobids, req, res);
@@ -11,6 +12,9 @@ const handleMultipleJobs = (jobIDs, req, res) => {
} }
const handleSingleJob = (req, res) => { const handleSingleJob = (req, res) => {
const client = req.userGraphQLClient;
return res.status(200).send(req.body); return res.status(200).send(req.body);
} }

View File

@@ -1,20 +1,18 @@
const Dinero = require("dinero.js"); const Dinero = require("dinero.js");
const queries = require("../graphql-client/queries"); const queries = require("../graphql-client/queries");
const GraphQLClient = require("graphql-request").GraphQLClient; const logger = require('../utils/logger');
const logger = require("../utils/logger");
// Dinero.defaultCurrency = "USD"; // Dinero.defaultCurrency = "USD";
// Dinero.globalLocale = "en-CA"; // Dinero.globalLocale = "en-CA";
Dinero.globalRoundingMode = "HALF_EVEN"; Dinero.globalRoundingMode = "HALF_EVEN";
exports.totalsSsu = async function (req, res) { exports.totalsSsu = async function (req, res) {
const BearerToken = req.headers.authorization;
const { id } = req.body; const { id } = req.body;
const BearerToken = req.BearerToken;
const client = req.userGraphQLClient;
logger.log("job-totals-ssu", "DEBUG", req.user.email, id, null); logger.log("job-totals-ssu", "DEBUG", req.user.email, id, null);
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {
headers: {
Authorization: BearerToken,
},
});
try { try {
const job = await client const job = await client
@@ -75,21 +73,19 @@ async function TotalsServerSide(req, res) {
} }
async function Totals(req, res) { async function Totals(req, res) {
const { job } = req.body; const { job, id } = req.body;
const logger = req.logger;
const client = req.userGraphQLClient;
logger.log("job-totals", "DEBUG", req.user.email, job.id, { logger.log("job-totals", "DEBUG", req.user.email, job.id, {
jobid: job.id, jobid: job.id,
}); });
const BearerToken = req.headers.authorization;
const { id } = req.body;
logger.log("job-totals-ssu", "DEBUG", req.user.email, id, null); logger.log("job-totals-ssu", "DEBUG", req.user.email, id, null);
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {
headers: {
Authorization: BearerToken,
},
});
await AutoAddAtsIfRequired({ job, client }); await AutoAddAtsIfRequired({ job, client });
try { try {
let ret = { let ret = {
parts: CalculatePartsTotals(job.joblines), parts: CalculatePartsTotals(job.joblines),

View File

@@ -0,0 +1,24 @@
const {GraphQLClient} = require("graphql-request");
/**
* Middleware to add a GraphQL Client to the request object
* Adds the following to the request object:
* req.userGraphQLClient - GraphQL Client with user Bearer Token
* req.BearerToken - Bearer Token
* @param req
* @param res
* @param next
*/
const withUserGraphQLClientMiddleware = (req, res, next) => {
const BearerToken = req.headers.authorization;
req.userGraphQLClient = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {
headers: {
Authorization: BearerToken,
},
});
req.BearerToken = BearerToken;
next();
};
module.exports = withUserGraphQLClientMiddleware;

View File

@@ -1,9 +1,8 @@
const path = require("path"); const path = require("path");
const _ = require("lodash"); const _ = require("lodash");
const logger = require("../utils/logger");
const xml2js = require("xml2js"); const xml2js = require("xml2js");
const GraphQLClient = require("graphql-request").GraphQLClient;
const queries = require("../graphql-client/queries"); const queries = require("../graphql-client/queries");
const logger = require('../utils/logger');
require("dotenv").config({ require("dotenv").config({
path: path.resolve( path: path.resolve(
@@ -15,13 +14,10 @@ require("dotenv").config({
exports.mixdataUpload = async (req, res) => { exports.mixdataUpload = async (req, res) => {
const { bodyshopid } = req.body; const { bodyshopid } = req.body;
const BearerToken = req.headers.authorization; const client = req.userGraphQLClient;
logger.log("job-mixdata-upload", "DEBUG", req.user.email, null, null); logger.log("job-mixdata-upload", "DEBUG", req.user.email, null, null);
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {
headers: {
Authorization: BearerToken,
},
});
try { try {
for (const element of req.files) { for (const element of req.files) {

View File

@@ -5,7 +5,6 @@ require("dotenv").config({
), ),
}); });
const GraphQLClient = require("graphql-request").GraphQLClient;
//const client = require("../graphql-client/graphql-client").client; //const client = require("../graphql-client/graphql-client").client;
const logger = require("../utils/logger"); const logger = require("../utils/logger");
const queries = require("../graphql-client/queries"); const queries = require("../graphql-client/queries");
@@ -182,12 +181,8 @@ async function OpenSearchSearchHandler(req, res) {
search, search,
}); });
const BearerToken = req.headers.authorization; const BearerToken = req.BearerToken;
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, { const client = req.userGraphQLClient;
headers: {
Authorization: BearerToken,
},
});
const assocs = await client const assocs = await client
.setHeaders({Authorization: BearerToken}) .setHeaders({Authorization: BearerToken})

View File

@@ -1,21 +1,19 @@
const Dinero = require("dinero.js"); const Dinero = require("dinero.js");
const queries = require("../graphql-client/queries"); const queries = require("../graphql-client/queries");
const logger = require('../utils/logger');
const { job } = require("../scheduling/scheduling-job"); const { job } = require("../scheduling/scheduling-job");
const GraphQLClient = require("graphql-request").GraphQLClient;
const logger = require("../utils/logger");
const _ = require("lodash"); const _ = require("lodash");
// Dinero.defaultCurrency = "USD"; // Dinero.defaultCurrency = "USD";
// Dinero.globalLocale = "en-CA"; // Dinero.globalLocale = "en-CA";
exports.partsScan = async function (req, res) { exports.partsScan = async function (req, res) {
const BearerToken = req.headers.authorization;
const { jobid } = req.body; const { jobid } = req.body;
const BearerToken = req.BearerToken;
const client = req.userGraphQLClient;
logger.log("job-parts-scan", "DEBUG", req.user?.email, jobid, null); logger.log("job-parts-scan", "DEBUG", req.user?.email, jobid, null);
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {
headers: {
Authorization: BearerToken,
},
});
try { try {
//Query all jobline data using the user's authorization. //Query all jobline data using the user's authorization.

View File

@@ -2,11 +2,12 @@ const express = require('express');
const router = express.Router(); const router = express.Router();
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
const {payments, payables, receivables} = require("../accounting/qbxml/qbxml"); const {payments, payables, receivables} = require("../accounting/qbxml/qbxml");
const withUserGraphQLClientMiddleware = require("../middleware/withUserGraphQLClientMiddleware");
router.use(validateFirebaseIdTokenMiddleware); router.use(validateFirebaseIdTokenMiddleware);
router.post('/qbxml/receivables', receivables); router.post('/qbxml/receivables', withUserGraphQLClientMiddleware, receivables);
router.post('/qbxml/payables', payables); router.post('/qbxml/payables', withUserGraphQLClientMiddleware, payables);
router.post('/qbxml/payments', payments); router.post('/qbxml/payments', withUserGraphQLClientMiddleware, payments);
module.exports = router; module.exports = router;

View File

@@ -2,9 +2,10 @@ const express = require('express');
const router = express.Router(); const router = express.Router();
const cdkGetMake = require('../cdk/cdk-get-makes'); const cdkGetMake = require('../cdk/cdk-get-makes');
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
const withUserGraphQLClientMiddleware = require("../middleware/withUserGraphQLClientMiddleware");
router.use(validateFirebaseIdTokenMiddleware); router.use(validateFirebaseIdTokenMiddleware);
router.post('/getvehicles', cdkGetMake.default); router.post('/getvehicles', withUserGraphQLClientMiddleware, cdkGetMake.default);
module.exports = router; module.exports = router;

View File

@@ -5,15 +5,16 @@ const {partsScan} = require('../parts-scan/parts-scan');
const eventAuthorizationMiddleware = require('../middleware/eventAuthorizationMIddleware'); const eventAuthorizationMiddleware = require('../middleware/eventAuthorizationMIddleware');
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
const {totals, statustransition, totalsSsu, costing, lifecycle, costingmulti} = require("../job/job"); const {totals, statustransition, totalsSsu, costing, lifecycle, costingmulti} = require("../job/job");
const withUserGraphQLClientMiddleware = require("../middleware/withUserGraphQLClientMiddleware");
router.use(validateFirebaseIdTokenMiddleware); router.use(validateFirebaseIdTokenMiddleware);
router.post('/totals', totals); router.post('/totals', withUserGraphQLClientMiddleware, totals);
router.post('/statustransition', eventAuthorizationMiddleware, statustransition); router.post('/statustransition', eventAuthorizationMiddleware, statustransition);
router.post('/totalsssu', totalsSsu); router.post('/totalsssu', withUserGraphQLClientMiddleware,totalsSsu);
router.post('/costing', costing); router.post('/costing', withUserGraphQLClientMiddleware,costing);
router.get('/lifecycle', lifecycle); router.get('/lifecycle', withUserGraphQLClientMiddleware, lifecycle);
router.post('/costingmulti', costingmulti); router.post('/costingmulti', withUserGraphQLClientMiddleware, costingmulti);
router.post('/partsscan', partsScan); router.post('/partsscan', withUserGraphQLClientMiddleware, partsScan);
module.exports = router; module.exports = router;

View File

@@ -9,6 +9,7 @@ const taskHandler = require("../tasks/tasks");
const os = require("../opensearch/os-handler"); const os = require("../opensearch/os-handler");
const eventAuthorizationMiddleware = require("../middleware/eventAuthorizationMIddleware"); const eventAuthorizationMiddleware = require("../middleware/eventAuthorizationMIddleware");
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
const withUserGraphQLClientMiddleware = require("../middleware/withUserGraphQLClientMiddleware");
//Test route to ensure Express is responding. //Test route to ensure Express is responding.
router.get("/test", async function (req, res) { router.get("/test", async function (req, res) {
@@ -18,7 +19,7 @@ router.get("/test", async function (req, res) {
// console.log(app.get('trust proxy')); // console.log(app.get('trust proxy'));
// console.log("remoteAddress", req.socket.remoteAddress); // console.log("remoteAddress", req.socket.remoteAddress);
// console.log("X-Forwarded-For", req.header('x-forwarded-for')); // console.log("X-Forwarded-For", req.header('x-forwarded-for'));
logger.log("test-api-status", "DEBUG", "api", { commit }); logger.log("test-api-status", "DEBUG", "api", {commit});
// sendEmail.sendServerEmail({ // sendEmail.sendServerEmail({
// subject: `API Check - ${process.env.NODE_ENV}`, // subject: `API Check - ${process.env.NODE_ENV}`,
// text: `Server API check has come in. Remote IP: ${req.socket.remoteAddress}, X-Forwarded-For: ${req.header('x-forwarded-for')}`, // text: `Server API check has come in. Remote IP: ${req.socket.remoteAddress}, X-Forwarded-For: ${req.header('x-forwarded-for')}`,
@@ -31,7 +32,7 @@ router.get("/test", async function (req, res) {
}); });
// Search // Search
router.post("/search", validateFirebaseIdTokenMiddleware, os.search); router.post("/search", validateFirebaseIdTokenMiddleware, withUserGraphQLClientMiddleware, os.search);
router.post("/opensearch", eventAuthorizationMiddleware, os.handler); router.post("/opensearch", eventAuthorizationMiddleware, os.handler);

View File

@@ -4,7 +4,8 @@ const multer = require('multer');
const upload = multer(); const upload = multer();
const {mixdataUpload} = require('../mixdata/mixdata'); const {mixdataUpload} = require('../mixdata/mixdata');
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
const withUserGraphQLClientMiddleware = require("../middleware/withUserGraphQLClientMiddleware");
router.post('/upload', validateFirebaseIdTokenMiddleware, upload.any(), mixdataUpload); router.post('/upload', validateFirebaseIdTokenMiddleware, withUserGraphQLClientMiddleware, upload.any(), mixdataUpload);
module.exports = router; module.exports = router;

View File

@@ -1,13 +1,14 @@
const express = require('express'); const express = require('express');
const router = express.Router(); const router = express.Router();
const {authorize, callback, receivables, payables, payments} = require('../accounting/qbo/qbo'); const {authorize, callback, receivables, payables, payments} = require('../accounting/qbo/qbo');
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); // Assuming you have a qbo module for handling QuickBooks Online related functionalities const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
const withUserGraphQLClientMiddleware = require("../middleware/withUserGraphQLClientMiddleware"); // Assuming you have a qbo module for handling QuickBooks Online related functionalities
// Define the routes for QuickBooks Online // Define the routes for QuickBooks Online
router.post('/authorize', validateFirebaseIdTokenMiddleware, authorize); router.post('/authorize', validateFirebaseIdTokenMiddleware, authorize);
router.get('/callback', callback); router.get('/callback', callback);
router.post('/receivables', validateFirebaseIdTokenMiddleware, receivables); router.post('/receivables', validateFirebaseIdTokenMiddleware, withUserGraphQLClientMiddleware, receivables);
router.post('/payables', validateFirebaseIdTokenMiddleware, payables); router.post('/payables', validateFirebaseIdTokenMiddleware, withUserGraphQLClientMiddleware, payables);
router.post('/payments', validateFirebaseIdTokenMiddleware, payments); router.post('/payments', validateFirebaseIdTokenMiddleware, withUserGraphQLClientMiddleware, payments);
module.exports = router; module.exports = router;

View File

@@ -2,7 +2,8 @@ const express = require('express');
const router = express.Router(); const router = express.Router();
const {job} = require('../scheduling/scheduling-job'); const {job} = require('../scheduling/scheduling-job');
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
const withUserGraphQLClientMiddleware = require("../middleware/withUserGraphQLClientMiddleware");
router.post('/job', validateFirebaseIdTokenMiddleware, job); router.post('/job', validateFirebaseIdTokenMiddleware, withUserGraphQLClientMiddleware, job);
module.exports = router; module.exports = router;

View File

@@ -1,4 +1,3 @@
const GraphQLClient = require("graphql-request").GraphQLClient;
const path = require("path"); const path = require("path");
const queries = require("../graphql-client/queries"); const queries = require("../graphql-client/queries");
const Dinero = require("dinero.js"); const Dinero = require("dinero.js");
@@ -14,17 +13,14 @@ require("dotenv").config({
}); });
exports.job = async (req, res) => { exports.job = async (req, res) => {
const BearerToken = req.headers.authorization;
const { jobId } = req.body; const { jobId } = req.body;
const BearerToken = req.BearerToken;
const client = req.userGraphQLClient;
try { try {
logger.log("smart-scheduling-start", "DEBUG", req.user.email, jobId, null); logger.log("smart-scheduling-start", "DEBUG", req.user.email, jobId, null);
const client = new GraphQLClient(process.env.GRAPHQL_ENDPOINT, {
headers: {
Authorization: BearerToken,
},
});
const result = await client const result = await client
.setHeaders({ Authorization: BearerToken }) .setHeaders({ Authorization: BearerToken })
.request(queries.QUERY_UPCOMING_APPOINTMENTS, { .request(queries.QUERY_UPCOMING_APPOINTMENTS, {