diff --git a/server/accounting/qbo/qbo-payables.js b/server/accounting/qbo/qbo-payables.js index b7bddd1a7..20f68441e 100644 --- a/server/accounting/qbo/qbo-payables.js +++ b/server/accounting/qbo/qbo-payables.js @@ -181,12 +181,13 @@ async function InsertBill(oauthClient, qbo_realmId, req, bill, vendor) { TxnDate: moment(bill.date) //.tz(bill.job.bodyshop.timezone) .format("YYYY-MM-DD"), - ...(bill.vendor.due_date && { - DueDate: moment(bill.date) - //.tz(bill.job.bodyshop.timezone) - .add(bill.vendor.due_date, "days") - .format("YYYY-MM-DD"), - }), + ...(!bill.is_credit_memo && + bill.vendor.due_date && { + DueDate: moment(bill.date) + //.tz(bill.job.bodyshop.timezone) + .add(bill.vendor.due_date, "days") + .format("YYYY-MM-DD"), + }), DocNumber: bill.invoice_number, //...(bill.job.class ? { ClassRef: { Id: classes[bill.job.class] } } : {}), diff --git a/server/accounting/qbxml/qbxml-payables.js b/server/accounting/qbxml/qbxml-payables.js index 07d426da7..28e7ba2cd 100644 --- a/server/accounting/qbxml/qbxml-payables.js +++ b/server/accounting/qbxml/qbxml-payables.js @@ -75,12 +75,13 @@ const generateBill = (bill) => { TxnDate: moment(bill.date) //.tz(bill.job.bodyshop.timezone) .format("YYYY-MM-DD"), - ...(bill.vendor.due_date && { - DueDate: moment(bill.date) - // .tz(bill.job.bodyshop.timezone) - .add(bill.vendor.due_date, "days") - .format("YYYY-MM-DD"), - }), + ...(!bill.is_credit_memo && + bill.vendor.due_date && { + DueDate: moment(bill.date) + // .tz(bill.job.bodyshop.timezone) + .add(bill.vendor.due_date, "days") + .format("YYYY-MM-DD"), + }), RefNumber: bill.invoice_number, Memo: `RO ${bill.job.ro_number || ""}`, ExpenseLineAdd: bill.billlines.map((il) => diff --git a/server/data/autohouse.js b/server/data/autohouse.js index 1cba662d6..46b4e2d6d 100644 --- a/server/data/autohouse.js +++ b/server/data/autohouse.js @@ -214,7 +214,7 @@ const CreateRepairOrderTag = (job, errorCallback) => { Street: job.ownr_addr1 || "", City: job.ownr_city || "", State: job.ownr_st || "", - Zip: job.ownr_zip || "", + Zip: (job.ownr_zip && job.ownr_zip.substring(0, 3)) || "", Phone1: job.ownr_ph1 || "", Phone2: null, Phone2Extension: null, @@ -488,8 +488,8 @@ const CreateRepairOrderTag = (job, errorCallback) => { PartsReconditionedCost: repairCosts.PartsReconditionedCost.toFormat(AHDineroFormat), PartsRecycled: Dinero( - job.job_totals.parts.parts.list.PAR && - job.job_totals.parts.parts.list.PAR.total + job.job_totals.parts.parts.list.PAL && + job.job_totals.parts.parts.list.PAL.total ).toFormat(AHDineroFormat), PartsRecycledCost: repairCosts.PartsRecycledCost.toFormat(AHDineroFormat), @@ -555,7 +555,9 @@ const CreateRepairOrderTag = (job, errorCallback) => { AHDineroFormat ), BMTotalCost: repairCosts.BMTotalCost.toFormat(AHDineroFormat), - MiscTotal: 0, + MiscTotal: Dinero(job.job_totals.additional.additionalCosts).toFormat( + AHDineroFormat + ), MiscTotalCost: 0, TowingTotal: Dinero(job.job_totals.additional.towing).toFormat( AHDineroFormat @@ -673,7 +675,7 @@ const CreateCosts = (job) => { }); return bill_acc; }, {}); - const materialsHours = { mapaHrs: 0, mashHrs: 0 }; + //If the hourly rates for job costing are set, add them in. if (job.bodyshop.jc_hourly_rates && job.bodyshop.jc_hourly_rates.mapa) { if ( @@ -694,9 +696,32 @@ const CreateCosts = (job) => { (job.bodyshop.jc_hourly_rates && job.bodyshop.jc_hourly_rates.mapa * 100) || 0, - }).multiply(materialsHours.mapaHrs) + }).multiply(job.job_totals.rates.mapa.hours) ); } + if (job.bodyshop.jc_hourly_rates && job.bodyshop.jc_hourly_rates.mash) { + if ( + !billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MASH + ] + ) + billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MASH + ] = Dinero(); + billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MASH + ] = billTotalsByCostCenters[ + job.bodyshop.md_responsibility_centers.defaults.costs.MASH + ].add( + Dinero({ + amount: + (job.bodyshop.jc_hourly_rates && + job.bodyshop.jc_hourly_rates.mash * 100) || + 0, + }).multiply(job.job_totals.rates.mash.hours) + ); + } + const ticketTotalsByCostCenter = job.timetickets.reduce( (ticket_acc, ticket_val) => { //At the invoice level.