From faf9fb75c5eff7c23aa61f877f1ff37a8c77e52c Mon Sep 17 00:00:00 2001 From: Allan Carr Date: Thu, 5 Mar 2026 18:01:53 -0800 Subject: [PATCH] IO-3601 Additional QBO Logging Signed-off-by: Allan Carr --- server/accounting/qbo/qbo-payables.js | 45 ++++++++++---- server/accounting/qbo/qbo-payments.js | 27 +++++---- server/accounting/qbo/qbo-receivables.js | 75 ++++++++++++++++++------ 3 files changed, 107 insertions(+), 40 deletions(-) diff --git a/server/accounting/qbo/qbo-payables.js b/server/accounting/qbo/qbo-payables.js index 85c989b21..23f538a48 100644 --- a/server/accounting/qbo/qbo-payables.js +++ b/server/accounting/qbo/qbo-payables.js @@ -130,12 +130,13 @@ exports.default = async (req, res) => { async function QueryVendorRecord(oauthClient, qbo_realmId, req, bill) { try { + const url = urlBuilder( + qbo_realmId, + "query", + `select * From vendor where DisplayName = '${StandardizeName(bill.vendor.name)}'` + ); const result = await oauthClient.makeApiCall({ - url: urlBuilder( - qbo_realmId, - "query", - `select * From vendor where DisplayName = '${StandardizeName(bill.vendor.name)}'` - ), + url: url, method: "POST", headers: { "Content-Type": "application/json" @@ -150,6 +151,11 @@ async function QueryVendorRecord(oauthClient, qbo_realmId, req, bill) { bodyshopid: bill.job.shopid, email: req.user.email }); + logger.log("qbo-payables-query", "DEBUG", req.user.email, null, { + method: "QueryVendorRecord", + call: url, + result: result.json + }); return result.json?.QueryResponse?.Vendor?.[0]; } catch (error) { @@ -167,8 +173,9 @@ async function InsertVendorRecord(oauthClient, qbo_realmId, req, bill) { DisplayName: StandardizeName(bill.vendor.name) }; try { + const url = urlBuilder(qbo_realmId, "vendor"); const result = await oauthClient.makeApiCall({ - url: urlBuilder(qbo_realmId, "vendor"), + url: url, method: "POST", headers: { "Content-Type": "application/json" @@ -184,6 +191,12 @@ async function InsertVendorRecord(oauthClient, qbo_realmId, req, bill) { bodyshopid: bill.job.shopid, email: req.user.email }); + logger.log("qbo-payments-insert", "DEBUG", req.user.email, null, { + method: "InsertVendorRecord", + call: url, + Vendor: Vendor, + result: result.json + }); if (result.status >= 400) { throw new Error(JSON.stringify(result.json.Fault)); @@ -274,11 +287,12 @@ async function InsertBill(oauthClient, qbo_realmId, req, bill, vendor, bodyshop) VendorRef: { value: vendor.Id }, - ...(vendor.TermRef && !bill.is_credit_memo && { - SalesTermRef: { - value: vendor.TermRef.value - } - }), + ...(vendor.TermRef && + !bill.is_credit_memo && { + SalesTermRef: { + value: vendor.TermRef.value + } + }), TxnDate: moment(bill.date) //.tz(bill.job.bodyshop.timezone) .format("YYYY-MM-DD"), @@ -318,8 +332,9 @@ async function InsertBill(oauthClient, qbo_realmId, req, bill, vendor, bodyshop) [logKey]: logValue }); try { + const url = urlBuilder(qbo_realmId, bill.is_credit_memo ? "vendorcredit" : "bill"); const result = await oauthClient.makeApiCall({ - url: urlBuilder(qbo_realmId, bill.is_credit_memo ? "vendorcredit" : "bill"), + url: url, method: "POST", headers: { "Content-Type": "application/json" @@ -335,6 +350,12 @@ async function InsertBill(oauthClient, qbo_realmId, req, bill, vendor, bodyshop) bodyshopid: bill.job.shopid, email: req.user.email }); + logger.log("qbo-payables-insert", "DEBUG", req.user.email, null, { + method: "InsertBill", + call: url, + postingObj: bill.is_credit_memo ? VendorCredit : billQbo, + result: result.json + }); if (result.status >= 400) { throw new Error(JSON.stringify(result.json.Fault)); diff --git a/server/accounting/qbo/qbo-payments.js b/server/accounting/qbo/qbo-payments.js index 47cdc9c97..dc17908b2 100644 --- a/server/accounting/qbo/qbo-payments.js +++ b/server/accounting/qbo/qbo-payments.js @@ -82,14 +82,7 @@ exports.default = async (req, res) => { if (isThreeTier || (!isThreeTier && twoTierPref === "name")) { //Insert the name/owner and account for whether the source should be the ins co in 3 tier.. - ownerCustomerTier = await QueryOwner( - oauthClient, - qbo_realmId, - req, - payment.job, - isThreeTier, - insCoCustomerTier - ); + ownerCustomerTier = await QueryOwner(oauthClient, qbo_realmId, req, payment.job, insCoCustomerTier); //Query for the owner itself. if (!ownerCustomerTier) { ownerCustomerTier = await InsertOwner( @@ -229,8 +222,9 @@ async function InsertPayment(oauthClient, qbo_realmId, req, payment, parentRef) paymentQbo }); try { + const url = urlBuilder(qbo_realmId, "payment"); const result = await oauthClient.makeApiCall({ - url: urlBuilder(qbo_realmId, "payment"), + url: url, method: "POST", headers: { "Content-Type": "application/json" @@ -246,6 +240,12 @@ async function InsertPayment(oauthClient, qbo_realmId, req, payment, parentRef) bodyshopid: payment.job.shopid, email: req.user.email }); + logger.log("qbo-payments-insert", "DEBUG", req.user.email, null, { + method: "InsertPayment", + call: url, + paymentQbo: paymentQbo, + result: result.json + }); if (result.status >= 400) { throw new Error(JSON.stringify(result.json.Fault)); @@ -428,8 +428,9 @@ async function InsertCreditMemo(oauthClient, qbo_realmId, req, payment, parentRe paymentQbo }); try { + const url = urlBuilder(qbo_realmId, "creditmemo"); const result = await oauthClient.makeApiCall({ - url: urlBuilder(qbo_realmId, "creditmemo"), + url: url, method: "POST", headers: { "Content-Type": "application/json" @@ -445,6 +446,12 @@ async function InsertCreditMemo(oauthClient, qbo_realmId, req, payment, parentRe bodyshopid: req.user.bodyshopid, email: req.user.email }); + logger.log("qbo-metadata-query", "DEBUG", req.user.email, null, { + method: "InsertCreditMemo", + call: url, + paymentQbo: paymentQbo, + result: result.json + }); if (result.status >= 400) { throw new Error(JSON.stringify(result.json.Fault)); diff --git a/server/accounting/qbo/qbo-receivables.js b/server/accounting/qbo/qbo-receivables.js index ef64fcdd8..71c935a5f 100644 --- a/server/accounting/qbo/qbo-receivables.js +++ b/server/accounting/qbo/qbo-receivables.js @@ -213,12 +213,13 @@ exports.default = async (req, res) => { async function QueryInsuranceCo(oauthClient, qbo_realmId, req, job) { try { + const url = urlBuilder( + qbo_realmId, + "query", + `select * From Customer where DisplayName = '${StandardizeName(job.ins_co_nm.trim())}' and Active = true` + ); const result = await oauthClient.makeApiCall({ - url: urlBuilder( - qbo_realmId, - "query", - `select * From Customer where DisplayName = '${StandardizeName(job.ins_co_nm.trim())}' and Active = true` - ), + url: url, method: "POST", headers: { "Content-Type": "application/json" @@ -233,6 +234,11 @@ async function QueryInsuranceCo(oauthClient, qbo_realmId, req, job) { jobid: job.id, email: req.user.email }); + logger.log("qbo-receivables-query", "DEBUG", req.user.email, job.id, { + method: "QueryInsuranceCo", + call: url, + result: result.json + }); return result.json?.QueryResponse?.Customer?.[0]; } catch (error) { @@ -266,8 +272,9 @@ async function InsertInsuranceCo(oauthClient, qbo_realmId, req, job, bodyshop) { } }; try { + const url = urlBuilder(qbo_realmId, "customer"); const result = await oauthClient.makeApiCall({ - url: urlBuilder(qbo_realmId, "customer"), + url: url, method: "POST", headers: { "Content-Type": "application/json" @@ -283,6 +290,12 @@ async function InsertInsuranceCo(oauthClient, qbo_realmId, req, job, bodyshop) { jobid: job.id, email: req.user.email }); + logger.log("qbo-receivables-insert", "DEBUG", req.user.email, job.id, { + method: "InsertInsuranceCo", + call: url, + customerObj: Customer, + result: result.json + }); return result.json?.Customer; } catch (error) { @@ -298,12 +311,13 @@ exports.InsertInsuranceCo = InsertInsuranceCo; async function QueryOwner(oauthClient, qbo_realmId, req, job, parentTierRef) { const ownerName = generateOwnerTier(job, true, null); + const url = urlBuilder( + qbo_realmId, + "query", + `select * From Customer where DisplayName = '${StandardizeName(ownerName)}' and Active = true` + ); const result = await oauthClient.makeApiCall({ - url: urlBuilder( - qbo_realmId, - "query", - `select * From Customer where DisplayName = '${StandardizeName(ownerName)}' and Active = true` - ), + url: url, method: "POST", headers: { "Content-Type": "application/json" @@ -318,6 +332,11 @@ async function QueryOwner(oauthClient, qbo_realmId, req, job, parentTierRef) { jobid: job.id, email: req.user.email }); + logger.log("qbo-receivables-query", "DEBUG", req.user.email, job.id, { + method: "QueryOwner", + call: url, + result: result.json + }); return result.json?.QueryResponse?.Customer?.find((x) => x.ParentRef?.value === parentTierRef?.Id); } @@ -347,8 +366,9 @@ async function InsertOwner(oauthClient, qbo_realmId, req, job, isThreeTier, pare : {}) }; try { + const url = urlBuilder(qbo_realmId, "customer"); const result = await oauthClient.makeApiCall({ - url: urlBuilder(qbo_realmId, "customer"), + url: url, method: "POST", headers: { "Content-Type": "application/json" @@ -364,6 +384,12 @@ async function InsertOwner(oauthClient, qbo_realmId, req, job, isThreeTier, pare jobid: job.id, email: req.user.email }); + logger.log("qbo-receivables-insert", "DEBUG", req.user.email, job.id, { + method: "InsertOwner", + call: url, + customerObj: Customer, + result: result.json + }); return result.json?.Customer; } catch (error) { @@ -378,12 +404,13 @@ async function InsertOwner(oauthClient, qbo_realmId, req, job, isThreeTier, pare exports.InsertOwner = InsertOwner; async function QueryJob(oauthClient, qbo_realmId, req, job, parentTierRef) { + const url = urlBuilder( + qbo_realmId, + "query", + `select * From Customer where DisplayName = '${job.ro_number}' and Active = true` + ); const result = await oauthClient.makeApiCall({ - url: urlBuilder( - qbo_realmId, - "query", - `select * From Customer where DisplayName = '${job.ro_number}' and Active = true` - ), + url: url, method: "POST", headers: { "Content-Type": "application/json" @@ -398,6 +425,11 @@ async function QueryJob(oauthClient, qbo_realmId, req, job, parentTierRef) { jobid: job.id, email: req.user.email }); + logger.log("qbo-receivables-query", "DEBUG", req.user.email, job.id, { + method: "QueryJob", + call: url, + result: result.json + }); const customers = result.json?.QueryResponse?.Customer; return customers && (parentTierRef ? customers.find((x) => x.ParentRef.value === parentTierRef.Id) : customers[0]); @@ -423,8 +455,9 @@ async function InsertJob(oauthClient, qbo_realmId, req, job, parentTierRef) { } }; try { + const url = urlBuilder(qbo_realmId, "customer"); const result = await oauthClient.makeApiCall({ - url: urlBuilder(qbo_realmId, "customer"), + url: url, method: "POST", headers: { "Content-Type": "application/json" @@ -440,6 +473,12 @@ async function InsertJob(oauthClient, qbo_realmId, req, job, parentTierRef) { jobid: job.id, email: req.user.email }); + logger.log("qbo-receivables-insert", "DEBUG", req.user.email, job.id, { + method: "InsertJob", + call: url, + customerObj: Customer, + result: result.json + }); if (result.status >= 400) { throw new Error(JSON.stringify(result.json.Fault));