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 @@
-
+