From e85be1c1737b15df331a75425d21eb6d1910adc6 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Wed, 31 Mar 2021 11:02:11 -0700 Subject: [PATCH 1/7] IO-813 Calculation updates to include adjustments --- .../job-totals-table.component.jsx | 6 +- .../job-totals.table.other.component.jsx | 26 ++++++- server/accounting/qbxml/qbxml-receivables.js | 2 +- server/job/job-totals.js | 69 +++++++++++-------- 4 files changed, 67 insertions(+), 36 deletions(-) diff --git a/client/src/components/job-totals-table/job-totals-table.component.jsx b/client/src/components/job-totals-table/job-totals-table.component.jsx index ab660b784..6262e2835 100644 --- a/client/src/components/job-totals-table/job-totals-table.component.jsx +++ b/client/src/components/job-totals-table/job-totals-table.component.jsx @@ -46,13 +46,13 @@ export function JobsTotalsTableComponent({ jobRO, job }) { - - + + - + diff --git a/client/src/components/job-totals-table/job-totals.table.other.component.jsx b/client/src/components/job-totals-table/job-totals.table.other.component.jsx index c3160e866..24f322f71 100644 --- a/client/src/components/job-totals-table/job-totals.table.other.component.jsx +++ b/client/src/components/job-totals-table/job-totals.table.other.component.jsx @@ -17,9 +17,29 @@ export default function JobTotalsTableOther({ job }) { key: t("jobs.labels.subletstotal"), total: job.job_totals.parts.sublets.total, }, + ...((job.job_totals.additional.additionalCostItems && + job.job_totals.additional.additionalCostItems.map((i) => { + return { + key: i.key, + total: i.total, + }; + })) || + []), { - key: t("jobs.labels.additionaltotal"), - total: job.job_totals.additional, + key: t("jobs.fields.adjustment_bottom_line"), + total: job.job_totals.additional.adjustments, + }, + { + key: t("jobs.fields.towing"), + total: job.job_totals.additional.towing, + }, + { + key: t("jobs.fields.storage"), + total: job.job_totals.additional.storage, + }, + { + key: t("jobs.fields.pvrt"), + total: job.job_totals.additional.pvrt, }, ]; }, [job.job_totals, t]); @@ -67,7 +87,7 @@ export default function JobTotalsTableOther({ job }) { - {Dinero(job.job_totals.parts.parts.total).toFormat()} + {Dinero(job.job_totals.additional.total).toFormat()} diff --git a/server/accounting/qbxml/qbxml-receivables.js b/server/accounting/qbxml/qbxml-receivables.js index bc5cc2eb4..cb1c6a6e6 100644 --- a/server/accounting/qbxml/qbxml-receivables.js +++ b/server/accounting/qbxml/qbxml-receivables.js @@ -199,7 +199,7 @@ const generateInvoiceQbxml = ( (i) => jobline.profitcenter_part.toLowerCase() === i.name.toLowerCase() ); - if (!!!account) { + if (!account) { throw new Error( `A matching account does not exist for the allocation. Center: ${center}` ); diff --git a/server/job/job-totals.js b/server/job/job-totals.js index f17a32e5c..06c5674a3 100644 --- a/server/job/job-totals.js +++ b/server/job/job-totals.js @@ -279,31 +279,41 @@ function IsAdditionalCost(jobLine) { } function CalculateAdditional(job) { - let ret = job.joblines + let ret = { + additionalCosts: null, + additionalCostItems: [], + adjustments: null, + towing: null, + storage: null, + pvrt: null, + total: null, + }; + ret.additionalCosts = job.joblines .filter((jl) => !jl.removed && IsAdditionalCost(jl)) .reduce((acc, val) => { - return acc.add( - Dinero({ amount: Math.round((val.act_price || 0) * 100) }).multiply( - val.part_qty || 1 - ) - ); + const lineValue = Dinero({ + amount: Math.round((val.act_price || 0) * 100), + }).multiply(val.part_qty || 1); + ret.additionalCostItems.push({ key: val.line_desc, total: lineValue }); + return acc.add(lineValue); }, Dinero()); - ret = ret - .add( - Dinero({ - amount: Math.round((job.towing_payable || 0) * 100), - }) - ) - .add( - Dinero({ - amount: Math.round((job.storage_payable || 0) * 100), - }) - ) - .add( - Dinero({ - amount: Math.round((job.ca_bc_pvrt || 0) * 100), - }) - ); + ret.adjustments = Dinero({ + amount: Math.round((job.adjustment_bottom_line || 0) * 100), + }); + ret.towing = Dinero({ + amount: Math.round((job.towing_payable || 0) * 100), + }); + ret.storage = Dinero({ + amount: Math.round((job.storage_payable || 0) * 100), + }); + ret.pvrt = Dinero({ + amount: Math.round((job.ca_bc_pvrt || 0) * 100), + }); + ret.total = ret.additionalCosts + .add(ret.adjustments) //IO-813 Adjustment takes care of GST & PST at labor rate. + .add(ret.towing) + .add(ret.storage) + .add(ret.pvrt); return ret; } @@ -312,7 +322,7 @@ function CalculateTaxesTotals(job, otherTotals) { const subtotal = otherTotals.parts.parts.subtotal .add(otherTotals.parts.sublets.subtotal) .add(otherTotals.rates.subtotal) //No longer using just rates subtotal to include mapa/mash. - .add(otherTotals.additional); + .add(otherTotals.additional.total); // .add(Dinero({ amount: (job.towing_payable || 0) * 100 })) // .add(Dinero({ amount: (job.storage_payable || 0) * 100 })); @@ -371,14 +381,15 @@ function CalculateTaxesTotals(job, otherTotals) { otherTotals.rates.subtotal.percentage((job.tax_lbr_rt || 0) * 100) // THis is currently using the lbr tax rate from PFH not PFL. ) .add( - Dinero({ - amount: Math.round((job.towing_payable || 0) * 100), - }).percentage((job.tax_tow_rt || 0) * 100) + otherTotals.additional.adjustments.percentage( + (job.tax_lbr_rt || 0) * 100 + ) ) .add( - Dinero({ - amount: Math.round((job.storage_payable || 0) * 100), - }).percentage((job.tax_str_rt || 0) * 100) + otherTotals.additional.towing.percentage((job.tax_tow_rt || 0) * 100) + ) + .add( + otherTotals.additional.storage.percentage((job.tax_str_rt || 0) * 100) ) .add(additionalItemsTax), local_tax: subtotal.percentage((job.local_tax_rate || 0) * 100), From 315b816e50656e926e3b5a0f53c89474d3c0115b Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Wed, 31 Mar 2021 11:26:22 -0700 Subject: [PATCH 2/7] Job Totals Calc Updates --- .../job-totals.table.other.component.jsx | 43 +++++++++------- .../jobs-detail-rates.component.jsx | 51 ++++++++++--------- .../layout-form-row.component.jsx | 8 +-- 3 files changed, 58 insertions(+), 44 deletions(-) diff --git a/client/src/components/job-totals-table/job-totals.table.other.component.jsx b/client/src/components/job-totals-table/job-totals.table.other.component.jsx index 24f322f71..00925007c 100644 --- a/client/src/components/job-totals-table/job-totals.table.other.component.jsx +++ b/client/src/components/job-totals-table/job-totals.table.other.component.jsx @@ -13,10 +13,6 @@ export default function JobTotalsTableOther({ job }) { const data = useMemo(() => { return [ - { - key: t("jobs.labels.subletstotal"), - total: job.job_totals.parts.sublets.total, - }, ...((job.job_totals.additional.additionalCostItems && job.job_totals.additional.additionalCostItems.map((i) => { return { @@ -30,15 +26,15 @@ export default function JobTotalsTableOther({ job }) { total: job.job_totals.additional.adjustments, }, { - key: t("jobs.fields.towing"), + key: t("jobs.fields.towing_payable"), total: job.job_totals.additional.towing, }, { - key: t("jobs.fields.storage"), + key: t("jobs.fields.storage_payable"), total: job.job_totals.additional.storage, }, { - key: t("jobs.fields.pvrt"), + key: t("jobs.fields.ca_bc_pvrt"), total: job.job_totals.additional.pvrt, }, ]; @@ -80,17 +76,30 @@ export default function JobTotalsTableOther({ job }) { x: true, }} summary={() => ( - - - {t("jobs.labels.additionaltotal")} - + <> + + + {t("jobs.labels.additionaltotal")} + - - - {Dinero(job.job_totals.additional.total).toFormat()} - - - + + + {Dinero(job.job_totals.additional.total).toFormat()} + + + + + + {t("jobs.labels.subletstotal")} + + + + + {Dinero(job.job_totals.parts.sublets.total).toFormat()} + + + + )} /> ); diff --git a/client/src/components/jobs-detail-rates/jobs-detail-rates.component.jsx b/client/src/components/jobs-detail-rates/jobs-detail-rates.component.jsx index 8a8965a13..c30edf955 100644 --- a/client/src/components/jobs-detail-rates/jobs-detail-rates.component.jsx +++ b/client/src/components/jobs-detail-rates/jobs-detail-rates.component.jsx @@ -52,6 +52,33 @@ export function JobsDetailRates({ jobRO, form }) { > + + + + + + + + + + + + + + + + + + - - - - - - @@ -134,24 +155,6 @@ export function JobsDetailRates({ jobRO, form }) { - - - - - - - - - diff --git a/client/src/components/layout-form-row/layout-form-row.component.jsx b/client/src/components/layout-form-row/layout-form-row.component.jsx index 94b1b1aa1..cec64c435 100644 --- a/client/src/components/layout-form-row/layout-form-row.component.jsx +++ b/client/src/components/layout-form-row/layout-form-row.component.jsx @@ -1,5 +1,5 @@ +import { Col, Divider, Row, Typography } from "antd"; import React from "react"; -import { Row, Col, Typography } from "antd"; import "./layout-form-row.styles.scss"; export default function LayoutFormRow({ @@ -41,10 +41,12 @@ export default function LayoutFormRow({ }, }; }; - + //{header ? {header} : null} return (
- {header ? {header} : null} + + {header} + {children.map( (c, idx) => From eca5bd21aede0280c8d34e31648fe5966dceefb1 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Wed, 31 Mar 2021 11:35:08 -0700 Subject: [PATCH 3/7] IO-829 Resolve Parts Order Calculations issues. --- client/.env.development2 | 13 +++++++++++++ .../job-bills-total/job-bills-total.component.jsx | 12 ++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 client/.env.development2 diff --git a/client/.env.development2 b/client/.env.development2 new file mode 100644 index 000000000..96ee2121d --- /dev/null +++ b/client/.env.development2 @@ -0,0 +1,13 @@ +FAST_REFRESH=false +REACT_APP_GRAPHQL_ENDPOINT=https://bodyshop-dev-db.herokuapp.com/v1/graphql +REACT_APP_GRAPHQL_ENDPOINT_WS=wss://bodyshop-dev-db.herokuapp.com/v1/graphql +REACT_APP_GA_CODE=231099835 +REACT_APP_FIREBASE_CONFIG={"apiKey":"AIzaSyDPLT8GiDHDR1R4nI66Qi0BY1aYviDPioc","authDomain":"imex-dev.firebaseapp.com","databaseURL":"https://imex-dev.firebaseio.com","projectId":"imex-dev","storageBucket":"imex-dev.appspot.com","messagingSenderId":"759548147434","appId":"1:759548147434:web:e8239868a48ceb36700993","measurementId":"G-K5XRBVVB4S"} +REACT_APP_CLOUDINARY_ENDPOINT_API=https://api.cloudinary.com/v1_1/bodyshop +REACT_APP_CLOUDINARY_ENDPOINT=https://res.cloudinary.com/bodyshop +REACT_APP_CLOUDINARY_API_KEY=473322739956866 +REACT_APP_CLOUDINARY_THUMB_TRANSFORMATIONS=c_fill,f_auto,h_250,w_250 +REACT_APP_FIREBASE_PUBLIC_VAPID_KEY='BG3tzU7L2BXlGZ_3VLK4PNaRceoEXEnmHfxcVbRMF5o5g05ejslhVPki9kBM9cBBT-08Ad9kN3HSpS6JmrWD6h4' +REACT_APP_STRIPE_PUBLIC_KEY=pk_test_51GqB4TJl3nQjrZ0wCQWAxAhlNF8jKe0tipIa6ExBaxwJGitwvFsIZUEua4dUzaMIAuXp4qwYHXx7lgjyQSwP0Pe900vzm38C7g +REACT_APP_AXIOS_BASE_API_URL=https://api.imex.online/ +REACT_APP_REPORTS_SERVER_URL=https://reports.bodyshop.app \ No newline at end of file diff --git a/client/src/components/job-bills-total/job-bills-total.component.jsx b/client/src/components/job-bills-total/job-bills-total.component.jsx index ad659b9f6..3fd5e8c12 100644 --- a/client/src/components/job-bills-total/job-bills-total.component.jsx +++ b/client/src/components/job-bills-total/job-bills-total.component.jsx @@ -32,7 +32,7 @@ export default function JobBillsTotalComponent({ if (p.return) { totalReturns = totalReturns.add( Dinero({ - amount: Math.round((pol.cost || 0) * 100), + amount: Math.round((pol.act_price || 0) * 100), }).multiply(pol.quantity) ); } @@ -74,7 +74,7 @@ export default function JobBillsTotalComponent({ const discrepWithLbrAdj = discrepancy.add(lbrAdjustments); const discrepWithCms = discrepWithLbrAdj.subtract(billCms); - const creditsNotReceived = totalReturns.subtract(billCms); + const creditsNotReceived = totalReturns.add(billCms); //billCms is tracked as a negative number. return ( @@ -89,7 +89,7 @@ export default function JobBillsTotalComponent({ @@ -100,7 +100,7 @@ export default function JobBillsTotalComponent({ @@ -111,7 +111,7 @@ export default function JobBillsTotalComponent({ @@ -126,7 +126,7 @@ export default function JobBillsTotalComponent({ From 79fc39b96457e397bb050bb5b18349005468b4c7 Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Wed, 31 Mar 2021 11:41:17 -0700 Subject: [PATCH 4/7] IO-830 Label fix. --- bodyshop_translations.babel | 23 ++++++++++++++++++- client/.env.development2 | 13 ----------- .../job-detail-cards.component.jsx | 4 ++-- client/src/translations/en_us/common.json | 1 + client/src/translations/es/common.json | 1 + client/src/translations/fr/common.json | 1 + 6 files changed, 27 insertions(+), 16 deletions(-) delete mode 100644 client/.env.development2 diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 6ce263e40..f1347305d 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -1,4 +1,4 @@ - +